调用函数 - 将“左值作为一元”和“操作数”

时间:2014-10-07 22:47:43

标签: c

我目前在一个问题上被阻止了,在你看之前,试着想一想,我只是一个尝试使用带功能的指针的初学者。

我自己解释一下: 我需要一个菜单​​(Function)谁可以在其他任何功能午餐,但我的问题是我从我的“主”调用我的函数,所以我试图在我的函数中使用指针。 我只是学习如何使用指针,所以这是我现在要做的第一件事。

也许是错误的方式,我仍然在互联网上搜索如何做或做得对。

现在我收到此错误消息:

  

左值作为一元'&'操作数

以下是我更正的代码:(简化了最大可读性)

#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”这个非常快速的答案,你指出我正确的方向来解决我的问题。

2 个答案:

答案 0 :(得分:2)

这个声明没有意义:

void Welcome(char *PointeurNameHuman[50])

您是否意味着以下内容?

void Welcome(char *PointeurNameHuman)

另外,这条线错了:

void *PointeurWelcome = &Welcome(PointeurNameHuman);

你可能也是这个意思:

void (*PointeurWelcome)() = &Welcome;

同样这条线很奇怪:

char NameHuman[50] = "HUMAN";

通常,在使用常量数据初始化数组时,不会声明数组大小。相反,你可以这样写:

char NameHuman[] = "HUMAN";

这样做的好处是你不会在常量中包含所有额外的尾随零字节。

此外,当您调用MenuPointeurWelcome内的位置,代码中的该点未声明。该范围内不存在该变量。

此外,在Menu内,通常人们使用局部变量来从scanf读取数据。例如,像这样:

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

而不是你拥有的东西。

我强烈建议您启用编译器警告,因为您可能会发现其他几个错误。

答案 1 :(得分:0)

N.B:在编译器上启用警告。 -Wall -pedantic是海湾合作委员会和铿锵声的好旗帜。有关详细信息,请参阅编译器的文档。

char *PointeurNameHuman[50]char NameHuman[50]char *PointeurNameHuman是不同的声明。请参阅标准中的此示例:

§6.7.6.2

  

7例1

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

声明一个float数组和一个指向float的指针数组   号。

如果您在申报时遇到问题,请参阅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 Welcome(char* PointeurNameHuman)
{
    printf("\n\nWelcome %s \nPlease enter your name: ", PointeurNameHuman);
}

int main(int argc, char *argv[])
{
    char NameHuman[] = "HUMAN";
    Welcome(NameHuman);
    return 0;
}

其次,要解决原始错误,您的函数指针语法不正确。 void *声明一个void指针,而不是一个函数指针。在您的修改中,您将其更改为void (*PointerWelcome)() = &Welcome(variable),但仍然不正确。您现在正在尝试获取void表达式的地址。请改用void (*)()

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

出于某种原因,您在main函数中声明了一个本地函数原型。您已经有Welcome的定义,请删除:

void Welcome(PointeurNameHuman);

如果PointeurNameHuman有类型,则会与之前的Welcome声明冲突。

您声明Menu函数无效,但您在三个不同的地方返回0。将Menu的签名更改为int Menu(...)或将返回表达式更改为return;

最后,你还没有正确地声明一个函数指针。

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