2010-02-27 4 views
3

J'essaie de faire des exercices en C++, mais je suis confronté à une erreur sur la construction, qui ne me vient pas à l'esprit. Qu'est-ce que je rate? Je reviens à C++ de C# et al après l'avoir fait il y a des années.Dépister une erreur étrange

[ERREUR] erreur de syntaxe: 'return' [/ ERREUR]

#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

littéraux de chaîne sont 'const char *' vous ne devriez pas être de les affecter à un conteneur 'char *', et vous êtes une fuite la mémoire 'char ** Drinks'. Pourrait aussi bien utiliser 'vecteur Boissons; Drinks.push_back ("Soda"); // etc' à la place, et cela vous permettra aussi de laisser tomber le 'MaxNumDrinks' codé en dur. (Qui est buggy, d'ailleurs: vous avez 5 boissons, pas 4.) – ephemient

+1

Non connecté à l'erreur de compilation, mais faites-vous une faveur et perdez la macro. Réimplémentez 'isValidDrinkChoice' comme une simple fonction - il n'y a aucune raison pour que ce soit une macro et il y a plein de raisons pour lesquelles cela ne devrait pas être le cas. –

+0

En outre: 's/(Choix> 0)/(Choix> = 0) /', 's/& argc/argc /', 's/* Boissons [Choix]/Boissons [Choix] /' – jfs

Répondre

3

Le code corrigé exemple sa boucle while qui doit remplacer

#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

Hmm .... 3 questions: 1.) Pourquoi est-ce que je retourne une valeur basée sur si cin.good() renvoie vrai ou faux? 2.) Pourquoi l'utilisation de l'encapsulation de l'espace de noms autour de la fonction isValidDrinkChoice()? 3.) Pourquoi "&& cin" dans la condition while? – bitcycle

+0

@Sean Ochoa: si 'cin' est dans un état invalide quand la boucle est infinie sans la condition« && cin' ». 'main()' devrait retourner '0' en cas de succès, différent de zéro. La présence de boucles infinies non intentionnelles ou de succès de rapport ('return 0') en cas d'échec est considéré comme un bug à corriger. – jfs

+0

@Sean Ochoa: sur l'encapsuleur d'espace de noms http://stackoverflow.com/questions/154469/unnamed-anonymous-namespaces-vs-static-functions – jfs

6

Je ne pense pas qu'il y ait un do while comme ça en C++. C'est do { ... } while (expression);. Ou while (expression) { ... }.