2014-10-07 37 views
-4

我目前被一個問題阻塞,在你看之前,試着認爲我是一個只有初學者試圖使用指針帶功能。我需要一個菜單​​(函數)誰可以午餐任何其他功能,但我的問題是,我從我的「主」調用我的功能,所以我試圖在我的功能中使用指針。 我只是學習如何使用指針,所以這是我現在明瞭的第一件事。調用一個函數 - 獲得「需要作爲一元運算的左值」和「操作數」

也許這是錯誤的方式,我仍然在互聯網上搜索如何做到或做正確的。

現在,我得到這個錯誤信息:需要

左值作爲一元 '&' 操作數

這裏是我糾正代碼:(簡化了最大的可讀性)

#include <stdio.h> 
#include <stdlib.h> 

void Menu(char *PointeurNameHuman, int *PointeurChoix, int *PointeurChoix1, int *PointeurChoix2, int *PointeurChoix3, void *PointeurWelcome()) 
{ 
    printf("\n\nEnter your choice: \n "); 
    scanf("%d", PointeurChoix); 

    while ((*PointeurChoix != 1) || (*PointeurChoix != 2) || (*PointeurChoix != 3)) 
    { 
     if (*PointeurChoix == *PointeurChoix1) 
     { 
      printf("\n! Play! \n "); 
      PointeurWelcome(PointeurNameHuman); 
      return 0; 
     } 
     else if (*PointeurChoix == *PointeurChoix2) 
     { 
      return 0; 
     } 
     else if (*PointeurChoix == *PointeurChoix3) 
     { 
      return 0; 
     } 
    } 
} 

void Welcome(char *PointeurNameHuman) 
{ 
    printf("\n\nWelcome %s \nPlease enter your name: ", PointeurNameHuman); 
} 

int main(int argc, char *argv[]) 
{ 
    char NameHuman[] = "HUMAN"; 
    int Choix, Choix1 = 1, Choix2 = 2, Choix3 = 3; 

    char *PointeurNameHuman = &NameHuman; 
    int *PointeurChoix = &Choix; 
    int *PointeurChoix1 = &Choix1; 
    int *PointeurChoix2 = &Choix2; 
    int *PointeurChoix3 = &Choix3; 

    void Welcome(PointeurNameHuman); 

    void (*PointeurWelcome)() = &Welcome; // OLD Error 

    Menu(PointeurNameHuman,PointeurChoix,PointeurChoix1,PointeurChoix2,PointeurChoix3,PointeurWelcome); 
} 

關於如何簡化我的代碼的所有評論也歡迎! 在此先感謝您的答案,祝您有個美好的日子。

編輯:非常感謝「b4hand」這個快速的回答,您指出我正確的方向來解決我的問題。

+0

您是否有錯誤消息的行號?這將有助於指出這個問題。 – b4hand 2014-10-07 22:50:46

+0

嘗試通過獲取「void」表達式的地址來形成'void *' – Oktalist 2014-10-07 22:52:29

+0

看起來您需要一個函數指針。 'void(* PointeurWelcome)()=&歡迎(PointeurNameHuman);'。 – 2014-10-07 22:53:03

回答

2

該聲明沒有意義:

void Welcome(char *PointeurNameHuman[50]) 

你也許意味着以下?

void Welcome(char *PointeurNameHuman) 

另外,該線路是錯誤的:

void *PointeurWelcome = &Welcome(PointeurNameHuman); 

你可能意味着這個問題,以及:

void (*PointeurWelcome)() = &Welcome; 

同樣這條線是奇怪:

char NameHuman[50] = "HUMAN"; 

通常情況下, y時不聲明數組大小用常數數據初始化它。相反,你可以這樣寫:

char NameHuman[] = "HUMAN"; 

的優勢,這是你將不包括所有在常量額外追加零個字節。

此外,當您調用PointeurWelcome時,Menu內部的位置,它在代碼中的那一點未聲明。該變量不在該範圍內。

另外,在Menu的內部,通常人們使用局部變量來讀取scanf的數據。例如,像這樣:

int Choix; 
scanf("%d", &Choix); 

而不是你有什麼。

我強烈建議你啓用編譯器警告,因爲你可能會發現你犯過的其他錯誤。

+0

Thx到您的回覆我啓用找到並糾正我的錯誤。 – Dinodzo 2014-10-07 23:12:41

0

N.B:在您的編譯器上啓用警告。 -Wall -pedantic是GCC和鐺的好標誌。有關詳細信息,請查閱您的編譯器文檔。

char *PointeurNameHuman[50],char NameHuman[50]char *PointeurNameHuman是不同的聲明。看到此例中的標準:

§6.7.6.2

7實施例1

float fa[11], *afp[17]; 

聲明浮點數的數組和一個指針數組浮動 號碼。

如果您遇到過聲明問題,請參閱cdecl

char *PointeurNameHuman = &NameHuman;不會做你的想法。

main.cpp:4:31: warning: initialization from incompatible pointer type 
    char *PointeurNameHuman = &NameHuman; 

你大概的意思做char *PointeurNameHuman = NameHuman;相反,雖然這是不必要的,因爲arrays decay to pointers。其次,爲了解決你原來的錯誤,你有一個函數指針的語法不正確。 void *聲明瞭一個void指針,而不是一個函數指針。在您的編輯中,您將其更改爲void (*PointerWelcome)() = &Welcome(variable),但仍然不正確。您現在正在嘗試使用無效表達式的地址。使用void (*)()代替:

void (*PointerWelcome)() = &Welcome; 
PointerWelcome(variable); 

出於某種原因,你聲明在主函數中的局部功能的原型。您已經有Welcome一個定義,刪除:

void Welcome(PointeurNameHuman); 

如果PointeurNameHuman有一個類型,它會與你以前的Welcome聲明衝突。

你聲明你的Menu函數void,但你在三個不同的地方返回0。請將Menu的簽名更改爲int Menu(...)或將您的退貨表達更改爲return;

最後,你還沒有正確地聲明函數指針。

void Menu(/* ... */ void (*PointeurWelcome)()) 
+0

在回答問題之前就已經確定了錯誤,但問題的正確答案是,並且幫助我優化了代碼。 – Dinodzo 2014-10-07 23:14:26

相關問題