将参数传递给函数指针
Passing an argument to function pointer
我只是不知道如何在以下情况下传递参数:
#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);
}
在这里,我需要像第一个示例中那样更改退出函数(int quit(void);
到 int quit(char *s){};
),并使用 const char *exit = "GoodBye";
==>> [=15 这样的参数调用它=]
我知道此时我的程序只接受 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);
}
...
}
由于您使用的是一个函数指针数组,因此您不知道要接受哪些参数。但是您可以通过使函数采用 "unspecified number of arguments" 来避免重新编码。即从函数指针和 quit()
函数的函数定义和原型中删除作为参数的 void
。
int quit(const char*);
void show(const char *question, const char **options, int (**actions)(), int length);
int main(void){
const char *question = "Choose Menu\n";
const char *options[3] = {"Update", "Upgrade", "Quit"};
int (*actions[3])() = {update,upgrade,quit};
...
}
int quit(const char *msg){
printf("\n\tQuit...%s\n", msg);
return 0;
}
void show(const char *question, const char **options, int (**actions)(), int length){
....
int (*act)();
....
}
这是可行的,因为 C 允许没有显式参数的函数采用 "unspecified number of arguments"。否则,您需要使所有函数具有相似的签名。
我只是不知道如何在以下情况下传递参数:
#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);
}
在这里,我需要像第一个示例中那样更改退出函数(int quit(void);
到 int quit(char *s){};
),并使用 const char *exit = "GoodBye";
==>> [=15 这样的参数调用它=]
我知道此时我的程序只接受 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);
}
...
}
由于您使用的是一个函数指针数组,因此您不知道要接受哪些参数。但是您可以通过使函数采用 "unspecified number of arguments" 来避免重新编码。即从函数指针和 quit()
函数的函数定义和原型中删除作为参数的 void
。
int quit(const char*);
void show(const char *question, const char **options, int (**actions)(), int length);
int main(void){
const char *question = "Choose Menu\n";
const char *options[3] = {"Update", "Upgrade", "Quit"};
int (*actions[3])() = {update,upgrade,quit};
...
}
int quit(const char *msg){
printf("\n\tQuit...%s\n", msg);
return 0;
}
void show(const char *question, const char **options, int (**actions)(), int length){
....
int (*act)();
....
}
这是可行的,因为 C 允许没有显式参数的函数采用 "unspecified number of arguments"。否则,您需要使所有函数具有相似的签名。