2012-04-13 76 views
0

我得到以下代碼的錯誤消息,但它根本沒有意義。你能檢查這段代碼並告訴你有什麼問題嗎?已在相關產品線上評論了該代碼。預期';'在聲明的末尾

#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

我看到這個目標C.我相信有一種方法來告訴GCC編譯器,例如,允許對函數內聲明的功能,即使這種行爲是不默認情況下允許。如果你絕對不想要main之外的函數,可能有辦法做到這一點。 – 2012-04-13 21:48:58

回答

2

Funcitions不能在main中。更改爲:

#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

這將失敗,因爲函數沒有在main之前聲明。 – 2012-04-13 21:51:20

+0

工作。謝謝。 – pdenlinger 2012-04-13 21:59:55

+0

@PeterM更糟的是:這段代碼在兩個移動的函數中都使用了未聲明的名字,它甚至不應該編譯。 – sidyll 2012-04-14 00:17:32

1

在一個函數中有一個函數並不是一個好主意(因爲它不會編譯 - 也就是說你看到的 - 也沒有邏輯意義),在main和outside之外移動spendDollars並改變Euros vacationBudget作爲參數

0

你的功能spendDollarschargeEuros不能在主。

但它不是真的,你不能在方法中創建方法。 Sinds iOS 4.0可以創建Blocks。

欲瞭解更多信息,請按照this教程的塊

1

那是因爲你定義內的另一個 功能(main)的函數(spendDollars)。嵌套函數是不允許的,在這個意義上它們總是「全局的」 。

但是,你被允許聲明內的另一個函數,然後 作爲一個線索的編譯器:該功能在別處聲明,但現在它 知道參數和返回類型(默認爲int如果您使用未聲明的功能 )。

因此,編譯器在另一個函數內部看到函數語法,它就像函數簽名一樣,它 期望它是聲明。然後它 看到大括號併產生一個錯誤,因爲聲明在下一個塊之前沒有分號就結束了 。

你需要移動的功能spendDollarschargeEurosmain,因爲這個原因,你必須傳遞給 要修改局部變量的引用。這應該工作:

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

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

注意,->運營商將直接工作的指針,就像如果你 曾使用

(*b).budget -= 100; 

取消引用指針和對結構進行操作。打電話給你的新功能 作爲

spendDollars(&vacationBudget, numberDollars);