2012-03-02 4 views
-4

Вот ссылка на картину сообщения об ошибке:Debug Assertion ошибка для программы 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

Проголосовало за закрытие как «Этот вопрос не подходит для нашего формата Q & A. Мы ожидаем, что ответы, как правило, будут связаны с фактами, ссылками или конкретными знаниями; этот вопрос, скорее всего, потребует мнения, дебаты, аргументы, опрос или расширенное обсуждение ». Пожалуйста, постарайтесь сделать свой вопрос более подходящим для будущих посетителей сайта и посетите [FAQ] (http://stackoverflow.com/faq) –

+0

Я согласен: но я должен добавить: если эта книга, за которой вы следуете, побуждает вас код, как будто вам нужна новая книга, то есть C на C++ вам не хватает точки абстракций, предоставляемых вам C++ – 111111

+0

Стиль кодирования мудрый. Почему бы вам не вернуть несколько значений или несколько параметров вместо глобальных. Нет причин, по которым filePtrs openSalesPFiles не может взять список файлов или вернуть его вместо того, чтобы использовать его как глобальный. Также, если вы допустили использование C++ 11, чтобы вы могли написать 'auto varname = func();' –

ответ

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 также очень полезен.У меня есть исключения и утверждения везде в моем коде, и у меня почти нет неожиданного поведения. Просто ошибки, которые останавливают программу и приводят меня в строку, рассказывающую мне, что вызвало проблему. –

+0

Спасибо за помощь. – jwill22