#include <stdio.h>
#include <stdlib.h>
int (*(*ptr[2])[2])(); //arr of pointers to the array of func pointer
int (*arr_1[2])(int ,int);//arr of function pointers
(*arr_1[])()={add1, sub1};//add1 ,sub1 are simple functions returning int
int (*arr_2[2])(int ,int);
int a,b, user_func_choice;
(*arr_2[])()={add2, sub2};
int lib_choice,user_lib_choice;
int main(int argc , char* argv[]) {
printf("enter the lib number\t 1:Lib1 , 2:Lib2 \n");
scanf("%d", &user_lib_choice);
lib_choice=user_lib_choice-1;
if(lib_choice==0){
printf("Welcome to lib1\n");
printf("enter func choice==> 1: Add , 2: subtract\n");
scanf("%d", &user_func_choice);
printf("enter the numbers.\n");
scanf("%d%d",&a,&b);
int func_choice= user_func_choice-1;
ptr[0]= arr_1;
if(func_choice==0)
{
int sum1=(*(*ptr[lib_choice])[func_choice])(a,b);
printf("sum1=%1d\n\n", sum1);
}
else if(func_choice==1)
{
int subtract1=(*(*ptr[lib_choice])[func_choice])(a,b);
printf("sub1=%1d\n\n", subtract1);
}
else{printf("InValid Function/operator choice\n");}
return;
}
if(lib_choice=1){
int a, b, user_func_choice;
printf("welcome to lib2\n");
printf("enter func choice: 1: Add , 2: subtract\n");
scanf("%d", &user_func_choice);
printf("enter the numbers.\n");
scanf("%d%d",&a,&b);
ptr[1] = arr_2;
int func_choice= user_func_choice-1;
if(func_choice==0)
{
int sum2=(*(*ptr[lib_choice])[func_choice])(a,b);
printf("sum2=%1d\n\n", sum2);
}
else if(func_choice==1)
{
int subtract2=(*(*ptr[lib_choice])[func_choice])(a,b);
printf("sub2=%1d\n\n", subtract2);
}
return;
}
else{printf("InValid library choice\n");
}
return 0;
}
这里的每件事情都很好 但我想要的不是硬编码库(lib1或lib2)的初始化,而是让用户指定他想要初始化的库的数量。像这样的东西
int main(int argc , char* argv[]){
printf("enter the lib number\t 1:Lib1 , 2:Lib2 \n");
scanf("%d", &user_lib_choice);
if(argc!=2){printf("please specify the library number as sencond argument\n");return 0;}
int lib_choice_cmd=atoi(argv[1]);
if(lib_choice==1)
{
lib1_init();
}
else if(lib_choice==2)
{
lib1_init();
lib2_init();
}
lib_init()是将执行初始化过程的函数。如果用户将lib num指定为1,我将仅初始化lib1。我为lib1做了这个,但这给了我一个错误
lib1_init(){
(*arr_1[2])(int ,int)={add1 , sub1};
}
当我做的时候
lib1_init(){
arr_1[0]=add1;
arr_1[1]=sub1;
}
这给了我一个分段错误.Pleae告诉我出了什么问题
答案 0 :(得分:1)
您只能在初始化时进行初始化,而不能在以后进行初始化。即使这样,你的语法看起来很奇怪。
您当然可以对每个元素使用简单赋值:
<tr data-status = "<%= book.style %>">
答案 1 :(得分:1)
(*arr[2])()={add1 ,sub1};
除非该行与函数指针数组初始化出现在同一行,否则它是完全无意义的代码。
您可以在声明时初始化数组:
int(*arr[2])(int ,int) = {add1 ,sub1};
或者您可以分配单个项目,就像任何阵列一样:
arr[0] = add1;
在C中,您不能将数组分配给数组,也不能在一行上分配多个数组项。也就是说,你不能做int arr[2]; arr = {1,2};
函数指针数组与其他数组没什么不同。
如果要在运行时初始化数组,则必须在循环中逐个设置每个项目,或使用memcpy
。
答案 2 :(得分:0)
我没有理解这个问题,但是有一个语法错误: 如果你像这样声明一个指向函数数组的指针:
int(*arr[2])(int ,int)
你必须像这样调用这个函数:
(*arr[0])(some_int_stuff, some_other_int_stuff);
错误是索引必须小于2,并且您没有传递任何参数