【问题标题】:how to assign/initialize the array of function pointers only when i call a function to do so仅当我调用函数时如何分配/初始化函数指针数组
【发布时间】:2016-09-23 11:50:58
【问题描述】:
#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;
}

这给了我一个分段错误。请告诉我出了什么问题

【问题讨论】:

  • “仅在调用函数时”初始化绝对没有附加价值。初始化是在编译/加载时完成的,因此不会对运行时性能产生影响。 ...除非你想分配不同的函数。

标签: c arrays pointers function-pointers


【解决方案1】:

您只能在初始化时进行初始化,不能稍后进行。即使这样,你的语法看起来也很奇怪。

你当然可以对每个元素使用简单的赋值:

void array_init(void)
{
  arr_1[0] = add1;
  arr_1[1] = sub1;
}

【讨论】:

  • 错误:'arr' main.c:6:7 的类型冲突:注意:'arr' 的先前声明在这里是 int (*arr[2])(int ,int); main.c:26:13: 错误:无效的初始化 arr[0]= add1;
  • 我以前用过这个平面语法,但它给了我这个错误
【解决方案2】:
(*arr[2])()={add1 ,sub1};

除非该行与函数指针数组初始化出现在同一行,否则它是完全无意义的代码。

您可以像这样在声明时初始化数组:

int(*arr[2])(int ,int) = {add1 ,sub1};  

或者您可以分配一个单独的项目,就像任何数组一样:

arr[0] = add1;

在 C 中,您不能将数组分配给数组,也不能在一行上分配多个数组项。也就是说,您不能做到int arr[2]; arr = {1,2};Function 指针数组与其他数组没有什么不同。

如果你想在运行时初始化数组,你必须在循环中一个一个地设置每个项目,或者使用memcpy

【讨论】:

  • 当我做 arr_1[0]= add1; arr_1[1]=sub1;我收到错误:'arr_1' main.c:6:7 的类型冲突:注意:'arr_1' 的先前声明在这里是 int (*arr_1[2])(int ,int); ^ main.c:7:11: 错误:无效的初始化 arr_1[0]= add1;这里有什么问题??
  • @user123 编译器告诉你两次分配同一个变量是没有意义的。或者可能是您尝试分配错误类型的函数。您必须发布整个代码,否则很难说出原因。
  • @user123 再读一遍这个答案。尤其是第一句话。话虽如此,是什么让您相信您可以在文件范围内执行代码?你为什么首先使用全局变量?
【解决方案3】:

我没有正确理解这个问题,但是有一个语法错误: 如果你像这样声明一个指向函数数组的指针:

int(*arr[2])(int ,int)

你必须像这样调用函数:

(*arr[0])(some_int_stuff, some_other_int_stuff);

错误是索引必须小于2,并且你没有传递任何参数

【讨论】:

  • arr[0](some_int_stuff, some_other_int_stuff); 工作正常。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多