gpt4 book ai didi

c - 将参数传递给函数指针

转载 作者:行者123 更新时间:2023-12-02 09:30:00 25 4
gpt4 key购买 nike

我只是不知道如何传递参数,如下例所示:

#include<stdio.h>

void quit(const char*);

int main(void){
const char *exit = "GoodBye";
void (*fptr)(const char*) = quit;
(*fptr)(exit);

return 0;
}

void quit(const char *s){
printf("\n\t%s\n",s);
}

这就是我的程序应该如何工作并且确实如此,但是当我制作文本菜单时,我只是不知道如何做到这一点:

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

int update(void);
int upgrade(void);
int quit(void);
void show(const char *question, const char **options, int (**actions)(void), int length);

int main(void){
const char *question = "Choose Menu\n";
const char *options[3] = {"Update", "Upgrade", "Quit"};
int (*actions[3])(void) = {update,upgrade,quit};

show(question,options,actions,3);
return 0;
}

int update(void){
printf("\n\tUpdating...\n");
return 1;
}

int upgrade(void){
printf("\n\tUpgrade...\n");
return 1;
}

int quit(void){
printf("\n\tQuit...\n");
return 0;
}

void show(const char *question, const char **options, int (**actions)(void), int length){
int choose = 0, repeat = 1;
int (*act)(void);

do{
printf("\n\t %s \n",question);
for(int i=0;i<length;i++){
printf("%d. %s\n",(i+1),options[i]);
}

printf("\nPlease choose an Option: ");
if((scanf("%d",&choose)) != 1){
printf("Error\n");
}
act = actions[choose-1];
repeat = act();

if(act==0){
repeat = 0;
}
}while(repeat == 1);
}

这里我需要将 quit 函数(int quit(void); 更改为 int quit(char *s){};),如第一个示例中所示,使用类似 const char *exit = "GoodBye"; ==>> (*fptr)(exit);

的参数调用它

我知道此时我的程序仅使用 void 作为参数,但我这样做只是为了说明问题。

我对此很困惑。

编辑:

this int (*actions[3])(void) 我认为是一个函数指针数组,所有 3 个函数指针都采用 void 作为参数,但我需要知道是否可以使用一个接受参数的指针,否则我必须重新编码整个程序。

最佳答案

由于您有一个函数指针数组,因此所有函数都必须具有相同的类型。因此,至少每个函数都应该采用 const char *(并非所有函数都需要使用它),并且应该更改数组类型以匹配。

如果您想要更灵活的东西,您可以让函数接受单个void *,这样每个函数就可以传递一个不同的参数,然后将其转换为适当的类型。这就是 pthreads 将参数传递给启动新线程的函数的方式。您将失去一些编译时类型检查,所以如果您走这条路要小心。

编辑:

后者的一个例子:

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

int update(void *);
int upgrade(void *);
int quit(void *);

int main(void){
const char *question = "Choose Menu\n";
const char *options[3] = {"Update", "Upgrade", "Quit"};
int (*actions[3])(void *) = {update,upgrade,quit};

show(question,options,actions,3);
return 0;
}

int update(void *unused){
printf("\n\tUpdating...\n");
return 1;
}

int upgrade(void *unused){
printf("\n\tUpgrade...\n");
return 1;
}

int quit(void *message){
printf("\n\tQuit...%s\n", (char *)message);
return 0;
}

void show(const char *question, const char **options, int (**actions)(void *), int length){
...
if (act == quit) {
repeat = act("GoodBye");
} else {
repeat = act(NULL);
}
...
}

关于c - 将参数传递给函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34205509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com