2010-12-11 73 views
2

剛剛學習C並且這是我第一次對stackoverflow so我不確定是否有權要求這個問題,因爲它似乎比其他人在這裏的微不足道,但我發現這段代碼在一本教科書中,當我試圖在Visual Studio中編譯我得到這個:即使返回的數據似乎與函數返回類型相匹配,編譯器返回錯誤「char *(int)」與「int()'的間接級別不同」

**error C2040: 'menutext' : 'char *(int)' differs in levels of indirection from 'int()'** 

說實話我看過代碼,我不明白爲什麼編譯器在抱怨。我真的需要一些幫助。下面的代碼:

/*********************************************************/ 
/* */ 
/* MENU : program which prints out a menu */ 
/* */ 
/*********************************************************/ 
main() 
{ 
    int str_number; 
    for (str_number = 0; str_number < 13; str_number++) 
    { 
    printf ("%s",menutext(str_number)); 
    } 
} 
/*********************************************************/ 
char *menutext(int n) /* return n-th string ptr */ 
{ 
    static char *t[] = 
    { 
    " -------------------------------------- \n", 
    " | ++ MENU ++ |\n", 
    " | ~~~~~~~~~~~~ |\n", 
    " | (1) Edit Defaults |\n", 
    " | (2) Print Charge Sheet |\n", 
    " | (3) Print Log Sheet |\n", 
    " | (4) Bill Calculator |\n", 
    " | (q) Quit |\n", 
    " | |\n", 
    " | |\n", 
    " | Please Enter Choice |\n", 
    " | |\n", 
    " -------------------------------------- \n" 
    }; 
    return (t[n]); 
} 
+1

除了其他意見,所有的字符串字面指針應該是const,如修改它們是不確定的行爲。 – Puppy 2010-12-11 18:42:26

回答

7

你沒有原型的功能menutext(),從而Ç默認爲int返回類型。這將導致printf()抱怨(您的情況錯誤),因爲它期望它的第二個參數類型爲char *,而不是int類型。

添加下面兩行以上調用main()

#include <stdio.h> /* Needed for the call to printf() */ 
char *menutext(int); /* Prototype for menutext() */ 

此外,main()應該總是返回類型int,如果你不打算在任何參數傳遞,你應該在void通過明確說明意圖。因此,你的代碼的上半部分應該是這樣的:

#include <stdio.h> /* Needed for the call to printf() */ 
char *menutext(int); /* Prototype for menutext() */ 

int main(void) 
{ 
    /* main code here */ 
    return 0; 
} 
+0

非常感謝。這真的有幫助。我忘了編譯器假設'extern int',即使我想過我只是認爲當它到達函數定義時,它會忽視'extern int'假設並假定正確的類型。再次,謝謝。 – 2010-12-11 19:18:45