2016-04-25 105 views
-2

我的代碼應該是一個簡單的菜單來改變角色的盔甲。代碼是:沒有正確處理功能

#include <stdio.h> 
#include <string.h> 

struct Armor { 
    char chestplate [50]; 
    char helmet [50]; 
}; 

void changeArmor(){ 
    struct Armor character; 
    char a [50]; 
    printf("Choose a chestplate\n"); 
    scanf("%s",&a); 
    strcpy(character.chestplate,a); 
    printf("Choose a helmet\n"); 
    scanf("%s",&a); 
    strcpy(character.helmet,a); 
    menu(); 
} 

void checkArmor() { 
    struct Armor character; 
    printf("Your equipped chestplate is: %s\n", character.chestplate); 
    printf("Your equipped helmet is: %s\n", character.helmet); 
    menu(); 
} 

void menu() { 
    int a; 
    printf("What do you want to do?\n"); 
    printf("1.Change Armor.\n"); 
    printf("2.Check current armor.\n"); 
    printf("3.Quit\n"); 
    scanf("%d",&a); 
    if(a==1) changeArmor; // Oops: should be changeArmor(); 
    if(a==2) checkArmor; // Oops: should be checkArmor(); 
    if(a!=3) menu;   // Oops: maybe this should be menu(); — or … 
} 

void initializeChar(){ 
    struct Armor character; 
    strcpy(character.chestplate, "Shirt"); 
    strcpy(character.helmet, "Hat"); 
} 

int main() { 
    struct Armor character; 
    initializeChar(); 
    menu(); 
    return 0; 
} 

當我嘗試使用菜單上的任何東西時,程序總是退出,而不是運行調用的函數。在代碼中有什麼我一直在做錯的?

編輯:這是括號。謝謝。

+6

這些:'if(a == 1)changeArmor; if(a == 2)checkArmor;如果(a!= 3)菜單;'不是函數調用。你需要'changeArmor();'把它變成一個函數調用。您的編譯器可能會警告您有關無效的聲明。您可能不希望在'changeArmor()'和'checkArmor()'中對'menu()'進行遞歸調用。簡單地忽略它們 - 但是在'menu()'函數中創建一個循環,或者用'main()'調用'menu()'迭代。 –

+4

請勿修改問題以修復代碼,以免再次出現問題 –

+4

在給出答案後,請不要修改您的問題以使答案失效(或提供答案的評論)。對註釋進行必要的修改或多或少都可以,或者保持代碼不變並描述必要的修改,或者選擇一個有幫助的答案。 –

回答

2

我想你忘記了(),這意味着changeArmor()和checkArmor()是函數。

所以,當你做出選擇它沒有做任何事情,並會繼續,直到它到達返回0

+0

菜單也一樣。它也是一個功能。 – randominstanceOfLivingThing

+0

它實際上進入菜單一次,因爲它在帶括號的主函數中被調用。 –

+0

這就是主要功能。但它不被視爲菜單功能內的功能。 – randominstanceOfLivingThing

1

由於已經由喬納森·萊弗勒和T. Roncoli你是不是真的做函數調用的回答。例如菜單不是一個函數調用,它只是一個指向你的函數的指針。相反,您需要執行menu()以調用該函數。

PS:

我也想在這裏指出,它可能不值得擁有的遞歸菜單功能,因爲它只會增加你的堆棧內存段。在現實的系統中,堆棧實際上可以有多少可以增長的限制。您可以改爲使用迭代解決方案,直到退出命令(a == 3)通過。

人們可能會認爲C沒有一個堆棧的概念,但在x86和x64計算機上的所有的編譯器將使用堆棧自動變量和函數調用。

這將是一個很好的測試有多少你的籌碼可以在你的程序崩潰之前成長,通過不斷地給將觸發菜單()函數值。