2010-02-27 74 views
3

我正在嘗試做一些C++練習,但是我在編譯時遇到了一個錯誤,它不會跳到我身上。我錯過了什麼?在C#等人完成之前,我剛回到C++。追蹤奇怪的錯誤

[錯誤] 語法錯誤: '迴歸' [/ ERROR]

#include <iostream> 
using namespace std; 

/* Pre-compiler directives/macros */ 
#define isValidDrinkChoice(Choice,MaxNumDrinks) ((Choice < MaxNumDrinks) && (Choice > 0)) 

/* Primary Entry Point for Executable */ 
int main(const int & argc, char * argv[]){ 

    const int MaxNumDrinks = 4; 
    char ** Drinks; 
    Drinks = new char* [MaxNumDrinks]; 
    Drinks[0] = "Soda"; 
    Drinks[1] = "Water"; 
    Drinks[2] = "Coffee"; 
    Drinks[3] = "Tea"; 
    Drinks[4] = "Perrier Sparkling Water"; 

    int Choice = -1; 
    do while(!isValidDrinkChoice(Choice, MaxNumDrinks)) { 
     cout << "Please select your favorite drink\r\n\r\n" << endl; 
     for (int x = 0; x < MaxNumDrinks; x++) cout << "\t" << Drinks[x] << endl; 
     cin >> Choice; 
     if (isValidDrinkChoice(Choice, MaxNumDrinks)) cout << "\r\n\r\n" << "You chose " << *Drinks[Choice] << endl; 
    } 
    return 0; 
} 
+1

字符串文字'爲const char *'所以你不應該將其分配給一個'字符*'容器,而你泄露'char ** Drinks'記憶。不妨使用'vector 飲料; Drinks.push_back( 「蘇打」); //等等,而這會讓你放棄硬編碼的MaxNumDrinks。 (順便提一句,這是一個小錯誤:你有5杯酒,而不是4杯。) – ephemient 2010-02-27 07:11:17

+1

沒有連接到編譯錯誤,但是請你自己幫忙併丟掉宏。將'isValidDrinkChoice'重新實現爲一個簡單的函數 - 沒有理由認爲它應該是一個宏,它有許多理由不應該這樣做。 – 2010-02-27 07:41:38

+0

另外:'s /(Choice> 0)/(Choice> = 0)/','s /&argc/argc /','s/* Drinks [Choice]/Drinks [Choice] /' – jfs 2010-02-27 08:37:58

回答

3

更正後的代碼示例其while循環需要更換

#include <iostream> 

namespace { 
    bool isValidDrinkChoice(int Choice, int MaxNumDrinks) { 
    return ((Choice < MaxNumDrinks) && (Choice >= 0)); 
    } 
} 

/* Primary Entry Point for Executable */ 
int main() { 
    using namespace std; 

    const char *Drinks[] = { 
     "Soda", "Water", "Coffee", "Tea", "Perrier Sparkling Water" }; 
    const int MaxNumDrinks = sizeof(Drinks)/sizeof(*Drinks); 

    int Choice = -1; 
    do { 
     cout << "Please select your favorite drink\r\n\r\n" << endl; 
     for (int i = 0; i < MaxNumDrinks; i++) 
      cout << Drinks[i] << endl; 

     cin >> Choice; 

     if (isValidDrinkChoice(Choice, MaxNumDrinks)) 
      cout << "\r\n\r\n" << "You chose " << Drinks[Choice] << endl; 
    } while(!isValidDrinkChoice(Choice, MaxNumDrinks) && cin) ; 

    return cin.good() ? 0 : 1; 
} 
+0

嗯.... 3個問題: 1.)爲什麼我根據cin.good()是否返回true或false來返回一個值? 2.)爲什麼在isValidDrinkChoice()函數週圍使用名稱空間封裝? 3.)爲什麼「&& cin」在while狀態? – bitcycle 2010-02-27 16:03:28

+0

@Sean Ochoa:如果'cin'處於無效狀態,當循環無限且沒有'&& cin'條件時。 main()成功返回0,否則返回非0。無意的無限循環或報告成功(失敗返回0)的存在我認爲是應該修復的錯誤。 – jfs 2010-02-27 17:33:28

+0

@Sean Ochoa:名稱空間包裝器http://stackoverflow.com/questions/154469/unnamed-anonymous-namespaces-vs-static-functions – jfs 2010-02-27 17:36:54

6

我不認爲有一個do while一樣,在C++。這是do { ... } while (expression);。或者while (expression) { ... }