我目前在一个问题上被阻止了,在你看之前,试着想一想,我只是一个尝试使用带功能的指针的初学者。
我自己解释一下: 我需要一个菜单(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”这个非常快速的答案,你指出我正确的方向来解决我的问题。
答案 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";
这样做的好处是你不会在常量中包含所有额外的尾随零字节。
此外,当您调用Menu
时PointeurWelcome
内的位置,代码中的该点未声明。该范围内不存在该变量。
此外,在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)())