2012-03-02 93 views
-4

下面是錯誤消息的圖片的鏈接:調試斷言錯誤的C程序

http://www.flickr.com/photos/[email protected]/6798897020/in/photostream

這裏的實際編程問題。這是3號

http://books.google.com/books?id=bSy1hBCLNl8C&pg=PA335&lpg=PA335&dq=sales.dat+c%2B%2B&source=bl&ots=mmN9b4WzsN&sig=miAD8-u4ly8K1Mou9ZNHv90Nscc&hl=en&sa=X&ei=2wdQT_-4OtSCsgK-l5WyDg&ved=0CDcQ6AEwAg#v=onepage&q=sales.dat%20c%2B%2B&f=false

和這裏的源代碼

#include <iostream> 
#include <string> 
#include<stdio.h> 

using namespace std; 

#define numItems  8 
#define numSalesP 10 

// the product prices 
float prices [numItems] = {345.0, 853.0, 471.0, 933.0, 721.0, 663.0, 507.0, 259.00}; 

// the product numbers 
int prodNum [numItems] = {7,  8,  9,  10, 11, 12, 13, 14}; 

// the salespersons IDs 
int salesP [numSalesP] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

// the output file pointers 
FILE * filePtrs[numSalesP]; 

// sales totals for every salespersons 
float totals [numSalesP]; 

//get the product index from the prodNum array 
int getProdIndex (int product) { 
    int i; 
    for (i=0; i< numItems; i++) { 
     if (prodNum[i] == product) { 
      return i; 
     } 
    } 
    return -1; 
} 

// get a product price from the product index 
float getProdPrice (int prodIndex) { 
    return prices[prodIndex]; 
} 

// open a salesperson output file 
void openSalesPFiles() { 
    int i; 
    char fileName[16];; 

    for (i=0; i<numSalesP; i++) { 
     sprintf(fileName, "salespers%d.dat", i+1); 
//DEBUG   cout << fileName << endl; 
     filePtrs[i] = fopen(fileName, "r"); 
    } 
} 

// close Salespersons files 
void closeSalesPFiles() { 
    int i; 
    for (i=0; i<numSalesP; i++) { 
     fclose(filePtrs[i]); 
    } 
} 

// get sales person index from its ID 
int getSalesPIndex (int salesPerson) { 
    int i; 
    for (i=0; i< numSalesP; i++) { 
     if (salesP[i] == salesPerson) { 
      return i; 
     } 
    } 
    return -1; 
} 



int main() { 
    int i;     // generic counter 
    FILE * salesFile;  // the input file with all sales 
    int salesPId;   // salesperson ID 
    int salesPIndex;  // salesperson index in array 
    int prodId;    // product ID 
    int pIndex;    // product index in array 
    int qty;    // quantity 
    float total;   // total for one sale 

    // open all salespersons output files 
    openSalesPFiles(); 

    // open the input file 
    salesFile = fopen("sales.dat", "r"); 

    // read all record in the input file 
    while (!feof(salesFile)) { 

     fscanf(salesFile, "%d %d %d", &salesPId, &prodId, &qty); 
//DEBUG  cout << salesPId << " --- " << prodId << " --- " << qty << endl; 

     // validate sales person 
     salesPIndex = getSalesPIndex (salesPId); 
     if (salesPIndex < 0) { 
      cout << "Invalid Sales person ID " << salesPId << endl; 
      continue; 
     } 

//DEBUG  cout << "Salesperson index : " << salesPIndex << endl; 

     // validate product id 
     pIndex = getProdIndex (prodId); 
     if (pIndex < 0) { 
      cout << "invalid product id : " << prodId << endl; 
      fprintf(filePtrs[salesPIndex], "Invalid Product ID %d\n", prodId); 
      continue; 
     } 
     else { 
      // compute the sale total 
      total = qty * prices[pIndex]; 
//DEBUG   cout << "total : " << total << endl;; 

      // add it to the totals for this salesperson 
      totals[salesPIndex] += (qty * prices[pIndex]); 

      // write the sale to the salesperson file 
      fprintf(filePtrs[salesPIndex], "%d %d %2.2f\n", prodId, qty, total); 
     } 
    } 

    // print totals in salespersons files 
    for (i=0; i< numSalesP; i++) { 
     fprintf(filePtrs[i], "Total Sales : %8.2f\n", totals[i]); 
    } 

    // close all files 
    closeSalesPFiles(); 
    fclose(salesFile); 


} 

什麼是錯的代碼,會讓我有這樣的錯誤?謝謝:S

+0

投票結束爲'這個問題不適合我們的問答格式。我們期望答案通常涉及事實,參考或具體的專業知識;這個問題可能會徵求意見,辯論,爭論,投票或擴大討論。請嘗試使您的問題更適合該網站的未來訪問者,並訪問[FAQ](http://stackoverflow.com/faq) – 2012-03-02 00:19:26

+0

我同意:但我應該補充一點,如果您正在關注的那本書鼓勵您類似於你需要一本新書的代碼,那就是C++中的C,你錯過了C++ – 111111 2012-03-02 00:21:05

+0

提供的抽象概念。你爲什麼不返回一些值或者有更多的參數而不是全局變量。 Theres沒有理由filePtrs openSalesPFiles無法獲取文件列表或返回它而不是將其用作全局文件。此外,如果您允許使用C++ 11,那麼您可以編寫'auto varname = func();' – 2012-03-02 00:26:29

回答

9

斷言來自名爲feoferr.c的文件。這表明它與feof函數有關。斷言說它預計stream != NULL。斷言失敗,所以stream顯然是一個空指針。由於feof需要一個文件流參數,因此斷言消息提到的流是文件流參數是一個安全的猜測。你叫feof這樣的:

// open the input file 
salesFile = fopen("sales.dat", "r"); 

// read all record in the input file 
while (!feof(salesFile)) { 

所以也許salesFile是一個空指針。如您所知,當fopen無法打開文件時可能會發生這種情況。也許該文件不存在,或者您沒有讀取權限。


下一次您遇到錯誤時,請使用您面前的工具。你有一個調試器,當程序失敗時它會中斷你的程序。它可以將您帶到失敗的線路或距離它最近的線路。這應該給你一個提示,說你的問題在fopen後不久就會出現。開始在那裏調查。

在代碼後面設置斷點,看看在你的程序失敗之前你是否接近它們。如果您沒有那麼深入,那麼在發佈問題時不要包含這些功能。不要讓許多不相關的代碼陷入潛在的助手中來篩選,直到解決真正的問題。

當您遇到問題時,請確保您的函數返回您期望的值。如果您不知道期望他們返回什麼,請閱讀文檔並做一些實驗。確保你瞭解你寫的所有代碼。

+0

什麼搶劫說。 Callstack也非常有幫助。我在我的代碼中隨處可見異常和斷言,我幾乎沒有意外的行爲。只是錯誤,停止程序,並帶我到線告訴我是什麼原因造成的問題 – 2012-03-02 00:28:42

+0

感謝您的幫助 – jwill22 2012-03-13 16:16:36