如何在我调用函数时分配/初始化函数指针数组

时间:2016-09-23 11:50:59

标签: c arrays pointers function-pointers

#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告诉我出了什么问题

3 个答案:

答案 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,并且您没有传递任何参数