2014-10-07 39 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

相关问题