2009-11-22 81 views
0

您好!我正在從我的一門編程課程開始一箇舊項目,並且遇到了一些問題,它們會跟蹤我的代碼中的哪一行導致語法錯誤。無法檢測到哪條線路導致語法錯誤

當我嘗試編譯代碼時,Visual Studio告訴我,有對的主要含有此函數調用行結束語法錯誤:

sortData(CARRAY,numRec,sortby);

我不這麼認爲,因爲註釋掉這個調用只會將錯誤移動到下一行代碼中。

我不知道是什麼原因導致了錯誤,希望有經驗的眼睛可以幫助。

我已經包含了所有的代碼,因爲我懷疑這個函數調用之一導致了錯誤。

ohbijuan

P.S.另外 - 有誰知道編譯器是從頂部到底部編譯還是在編譯過程中它是否真正遵循函數調用?

#include <iostream> 
#include <string> 
#include <fstream> 
#include <iomanip> 
using namespace std; 

//customer struct 
struct customer 
{ 
    int id; 
    string fname, lname; 
    double totalQuantity, totalPurchases, totalProfit; 
}; 

//Error Codes 
const int INPUT_FILE_FAIL_NO_CONTINUE = 2; 
const int INPUT_FILE_DATA_ERROR = 3; 

//Global Constants 
const int arraySize = 200; 
const int numType = 5; //# of the types of coffee we currently offer 

//Coffee prices per pound 
const double colombWhole = 3.75; 
const double colombRetail = 4.85; 
const double konaWhole = 4.25; 
const double konaRetail = 5.25; 
const double ethiopWhole = 4.30; 
const double ethiopRetail = 5.75; 
const double jamaWhole = 5.25; 
const double jamaRetail = 7.75; 
const double brazWhole = 4.65; 
const double brazRetail = 5.90; 

//Function prototypes 
int readData (ifstream &infile, customer carray[], int size); 
//PRE: The address of the ifstream object, the addres of the array of customer structs and the size of 
//  the array is passed in 
//POST: All of the customer data is read in AND the totalQuantity, totalPurchases and totalProfit for 
//  each customer is calculated. The number of records read is returned. 

void sortData (customer carray[], int recordcount, int sortfield); 
//PRE: The address of the array of customers, the number of customer records in the array and the field 
//  on which to be sorted is passed into the function. 
//POST: The array is sorted on the basis of the specified field in ascending order 

int findMax (const customer carray[], int startRange, int recordcount, int sortfield); 
//PRE: The address of the array of customers, the field to sort on and a range of values is passed in 
//POST: The address of the largest value is returned 




int main() 
{ 
    //Array of customer structs 
    customer crecords[arraySize]; 

    //Initialize the members of our struct to zero 
    for (int i = 0; i < arraySize; i++) 
    { 
     crecords[i].totalProfit = 0; 
     crecords[i].totalPurchases = 0; 
     crecords[i].totalQuantity = 0; 
    } 

    //Declare filestream objects 
    ifstream ifile; 
    ofstream ofile1, ofile2, ofile3; 

    //user responses 
    char pquit = 'Y'; 
    char specAnother; 
    int sortby; 
    string ifilename; 

    //Ask user for name of input file 
    cout << "Please enter the name of the input file: " ; 
    cin >> ifilename; 

    //Attempt to open the input file 
    ifile.open(ifilename.c_str()); 
    while (ifile.fail()) 
    { 
     cout << endl << "The input file could not be found. Would you like to specify " 
       << "another file?" << endl << "(Enter Y or N):"; 
     cin  >> specAnother; //Ask user if they want to specify another 

     if (specAnother == 'N' || specAnother == 'n') 
     { 
      exit(INPUT_FILE_FAIL_NO_CONTINUE); 
     } 
     else 
     { 
      cout << endl << "Please enter the name of the new input file: " ; 
      cin  >> ifilename; 
     } 

     ifile.clear(); //Clear the flags, else the input file fail flag will perpetually return true 
     ifile.open(ifilename.c_str()); 

    } 

    //File opened successfully, let's begin reading in data and also keep track of the # of 
    //records read 
    int numRec = readData(ifile, crecords, arraySize); 
    cout << "Finished reading " << numRec << " records" << endl; 


    do 
    { 
     //Ask user how they would like to sort the data for the report 
     cout << endl << "What would you like to sort on?" << endl; 
     cout << "1) Sort by POUNDS bought" << endl 
       << "2) Sort by PURCHASE AMOUNT" << endl 
       << "3) Sort by PROFIT" << endl; 

     cin  >> sortby; 
     if (sortby > 3 || sortby < 1) 
     { 
      cout << "You entered an invalid sorting method, try again" << endl 
        << "Enter an option:"; 
      cin  >> sortby; 
     } 

     cout << "You entered " << sortby << endl; 
    } 

    //Sort Data 
    sortData(carray, numRec, sortby); 
    return 0; 
} 

//Function Definitions 
int readData (ifstream &infile, customer carray[], int size) 
{ 
    int x = 0, coffeeType, quantity; 
    double currentSale, internalCost, profitOnSale; 
    while (infile >> carray[x].id && x < size) 
    { 
     infile >> carray[x].fname >> carray[x].lname; 
     while (infile >> coffeeType && coffeeType != 0) 
     { 
      infile >> quantity; 
      switch(coffeeType) 
      { 
      case 1: 
       carray[x].totalQuantity += quantity; 
       currentSale = quantity * colombRetail; 
       carray[x].totalPurchases += currentSale; 
       internalCost = quantity * colombWhole; 
       profitOnSale = currentSale - internalCost; 
       carray[x].totalProfit += profitOnSale; 
       break; 

      case 2: 
       carray[x].totalQuantity += quantity; 
       currentSale = quantity * konaRetail; 
       carray[x].totalPurchases += currentSale; 
       internalCost = quantity * konaWhole; 
       profitOnSale = currentSale - internalCost; 
       carray[x].totalProfit += profitOnSale; 
       break; 

      case 3: 
       carray[x].totalQuantity += quantity; 
       currentSale = quantity * ethiopRetail; 
       carray[x].totalPurchases += currentSale; 
       internalCost = quantity * ethiopWhole; 
       profitOnSale = currentSale - internalCost; 
       carray[x].totalProfit += profitOnSale; 
       break; 

      case 4: 
       carray[x].totalQuantity += quantity; 
       currentSale = quantity * jamaRetail; 
       carray[x].totalPurchases += currentSale; 
       internalCost = quantity * jamaWhole; 
       profitOnSale = currentSale - internalCost; 
       carray[x].totalProfit += profitOnSale; 
       break; 

      case 5: 
       carray[x].totalQuantity += quantity; 
       currentSale = quantity * brazRetail; 
       carray[x].totalPurchases += currentSale; 
       internalCost = quantity * brazWhole; 
       profitOnSale = currentSale - internalCost; 
       carray[x].totalProfit += profitOnSale; 
       break; 

      default: 
       cout <<"The input file contains an undeclared coffee type at record " << x 
         <<"Program terminating!" << endl; 
       //return exit(INPUT_FILE_DATA_ERROR); 

      } 
     } 

     x++; //At this point, we have encountered our sentinel value of 0 that indicates the end of our 
     //customer record. Let's move on to the next customer.   
    } 

    return x; 
} 

int findMax (const customer carray[], int startRange, int recordcount, int sortfield) 
{ 
    int maxLoc = startRange; 
    switch(sortfield) 
    { 
    case 1: 

     for (int i = startRange + 1; i <= recordcount; i++) 
     { 
       if (carray[maxLoc].totalQuantity < carray[i].totalQuantity) 
       maxLoc = i; 
     } 

    case 2: 

     for (int i = startRange + 1; i <= recordcount; i++) 
     { 
      if (carray[maxLoc].totalPurchases < carray[i].totalPurchases) 
       maxLoc = i; 
     } 

    case 3: 

     for (int i = startRange + 1; i <= recordcount; i++) 
     { 
      if (carray[maxLoc].totalProfit < carray[i].totalProfit) 
       maxLoc = i; 
     }  
    } 

    return maxLoc; 
} 




void sortData (customer carray[], int recordcount, int sortfield) 
{ 
    for (int i = 0; i < recordcount ; i++) 
    { 
     int max = findMax(carray, i, recordcount, sortfield); 
     swap(carray[i], carray[max]); 
    } 
} 
+1

一般而言:錯誤的原因往往是在先前(非空)線。 – UncleBens 2009-11-22 21:30:58

回答

5

你的問題是,你有這樣的:僅僅是調用sortData

do 
{ 
    // ... 
} 

末尾沒有while (...);

+1

謝謝里奇!我不相信我錯過了這一點。該死的!我想我要回去睡覺了! – noobzilla 2009-11-22 17:46:19

+2

@obijuan:還有一件事。在函數findMax()中,案例缺少中斷;聲明。 – Naveen 2009-11-22 17:48:38

+0

非常感謝Naveen! – noobzilla 2009-11-22 23:56:04

2

while您的do..while聲明的條款是什麼?

2

do { … }需要在最後一個條件,如do { … } while (busy);如果你只是想在一個塊來執行一段代碼,只需把該塊存在並取出do

1

您的{}在括號後缺少while子句,這會導致語法錯誤。

我還注意到另一件事 - findMax switch語句缺少默認標記,並且它也缺少break語句。不知道這是否是你的意圖,但通常不適用於大多數開關。

+0

謝謝Kaleb。另一個想念我 - 這是我在編寫代碼時感冒藥的影響:) – noobzilla 2009-11-22 23:55:30

0

你在哪裏之後做什麼?

do { 
    // something 
} while(condition); 

這是正確的語法