2012-04-13 28 views
0

Ich bekomme diese Fehlermeldung für den folgenden Code, aber es macht überhaupt keinen Sinn. Können Sie bitte diesen Code überprüfen und sagen, was los ist? Habe den Code in der entsprechenden Zeile kommentiert.Erwartete ';' am Ende der Deklaration

#import <Foundation/Foundation.h> 

typedef struct { 
    float exchangeRate; 
    double budget; 
    double euroTransaction; 
} budget; 

int main(int argc, const char * argv[]) 
{ 
    budget vacationBudget; 

    void spendDollars (double dollars) { //Expected ';' at end of declaration 
     vacationBudget.budget -= 100; 
    } 

    void chargeEuros(double euros) { 
     vacationBudget.euroTransaction = euros*vacationBudget.exchangeRate; 
     vacationBudget.budget -= vacationBudget.euroTransaction; 
    } 

    vacationBudget.exchangeRate = 1.2500; 
    vacationBudget.budget = 1000.00; 
    double numberDollars = 100; 
    double numberEuros = 100; 

    spendDollars(numberDollars); 
    NSLog(@"Converting %.2f US dollars into euros leaves $%.2f", numberDollars, vacationBudget.budget); 



    NSLog(@"Charging %.2f euros leaves $%.2f", numberEuros, vacationBudget.budget); 

    return 0; 
} 
+0

ich dieses Ziel C. sehe ich glaube, dass es eine Möglichkeit, um den GCC-Compiler zu sagen, ist zum Beispiel zu ermöglichen Funktionen innerhalb von Funktionen deklariert werden, auch wenn dieses Verhalten nicht standardmäßig erlaubt Es kann einen Weg geben, dies zu tun, wenn Sie die Funktionen nicht unbedingt außerhalb von main möchten. –

Antwort

2

Funktionen können nicht innerhalb Haupt sein. Wechseln Sie zu:

#import <Foundation/Foundation.h> 

    typedef struct { 
     float exchangeRate; 
     double budget; 
     double euroTransaction; 
    } budget; 

budget vacationBudget; 

void spendDollars (double dollars) { //Expected ';' at end of declaration 
      vacationBudget.budget -= 100; 
    } 

    void chargeEuros(double euros) { 
      vacationBudget.euroTransaction = euros*vacationBudget.exchangeRate; 
      vacationBudget.budget -= vacationBudget.euroTransaction; 
    } 

    int main(int argc, const char * argv[]) 
    { 

     vacationBudget.exchangeRate = 1.2500; 
     vacationBudget.budget = 1000.00; 
     double numberDollars = 100; 
     double numberEuros = 100; 

     spendDollars(numberDollars); 
     NSLog(@"Converting %.2f US dollars into euros leaves $%.2f", numberDollars, vacationBudget.budget); 



     NSLog(@"Charging %.2f euros leaves $%.2f", numberEuros, vacationBudget.budget); 

     return 0; 
    } 
+5

Dies wird fehlschlagen, da die Funktionen nicht vor main deklariert sind. –

+0

Das hat funktioniert. Vielen Dank. – pdenlinger

+0

@PeterM Noch schlimmer: Dieser Code verwendet nicht deklarierte Namen in beiden verschobenen Funktionen, sollte es nicht einmal kompilieren. – sidyll

3

Verschieben Sie die Funktionen spendDollars und chargeEuros außerhalb der Hauptfunktion.

1

Nicht eine großartige Idee, eine Funktion innerhalb einer Funktion (wie in es nicht kompilieren - dh was Sie sehen - und es macht keinen logischen Sinn), verschieben Sie SpendDollars und ChangeEuros außerhalb von Main und Pass vacationBudget als Parameter

0

Ihre Funktionen spendDollars und chargeEuros kann nicht im Haupt sein.

Aber es ist nicht wahr, dass Sie keine Methoden in Methoden erstellen können. Seit iOS 4.0 können Sie Blöcke erstellen.

Weitere Informationen folgen this Tutorial über Blocks

1

Das ist, weil Sie definieren eine Funktion (spendDollars) innerhalb eines anderen Funktion (main) sind. Verschachtelte Funktionen sind nicht erlaubt, sie sind immer "global" in diesem Sinne.

Sie sind jedoch zu erlaubt eine Funktion innerhalb einer anderen zu erklären, die dann dient als Anhaltspunkt für den Compiler: diese Funktion an anderer Stelle erklärt wird, aber jetzt ist es kennt die Parameter und Rückgabetyp (welche standardmäßig int wenn Sie eine nicht deklarierte Funktion verwenden).

Also, dann sieht der Compiler die Funktion Syntax in einer anderen Funktion, es es eine Erklärung, wie Funktionssignaturen sein erwartet. Und dann sieht die öffnende geschweifte Klammer und erzeugt einen Fehler, da die Deklaration ohne ein Semikolon vor dem folgenden Block beendet.

Sie müssen die Funktionen spendDollars und chargeEuros nach außen main, und aus diesem Grund zu bewegen, müssen Sie einen Verweis auf die lokale Variable zu übergeben Sie ändern möchten. Diese sollten arbeiten:

void spendDollars (budget *b, double dollars) 
{ 
    b->budget -= 100; 
} 

void chargeEuros(budget *b, double euros) { 
    b->euroTransaction = euros*vacationBudget.exchangeRate; 
    b->budget -= vacationBudget.euroTransaction; 
} 

Beachten Sie, dass die -> Bediener direkt auf den Zeiger funktionieren wird, wie gerade wenn Sie

benutzt hatte
(*b).budget -= 100; 

Um den Zeiger dereferenzieren und arbeiten auf der Struktur. Rufen Sie Ihre neue Funktion als

spendDollars(&vacationBudget, numberDollars); 
Verwandte Themen