2016-09-23 38 views
0
#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()的東西是會做初始化process.If用戶指定的lib NUM爲1,我將僅初始化lib1內的功能。我這樣做是爲了LIB1,但是這給了我一個錯誤

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

當我做

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

這給了我分割fault.Pleae告訴我什麼是錯

+0

有一個在初始化「絕對沒有的增值,只有當我調用本功能離子」。初始化是在編譯/加載時完成的,因此沒有運行時性能的後果。 ...除非你想分配_different_函數。 –

回答

1

您只能初始化時進行初始化,而不是晚些時候。即使如此,你的語法看起來很奇怪。

可以當然使用純分配給每個元素:

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

錯誤:'arr'的衝突類型 main.c:6:7:注意:'arr'的先前聲明在這裏 int(* arr [2])(int,int); main。c:26:13:error:invalid initializer arr [0] = add1; – user123

+0

我以前使用過這種平面語法,但它給了我這個錯誤 – user123

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

除非該行出現在同一行作爲函數指針數組初始化,它是完整的無義代碼。

可以初始化這樣在聲明數組:

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

或者你可以指定一個單獨的項目,就像任何數組:

arr[0] = add1; 

在C中,你不能分配數組數組,也不能在一行上分配幾個數組項。也就是說,你不能int arr[2]; arr = {1,2};函數指針數組與其他數組沒有區別。

如果您想在運行時初始化數組,您必須在循環中逐個設置每個項目,或者使用memcpy

+0

當我做了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:error:invalid initializer arr_1 [0] = add1; 這裏有什麼不對? – user123

+0

@ user123編譯器告訴你兩次分配同一個變量是沒有意義的。或者您可能嘗試分配錯誤類型的函數。你必須發佈整個代碼,否則很難說明原因。 – Lundin

+0

我已經發布了代碼,你可以看看它 – user123

0

我沒有正確的理解這個問題,但有一個語法錯誤: 如果你聲明函數指針數組是這樣的:

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

你必須這樣調用該函數:

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

的錯誤是,該指數必須小於2,而你不傳遞任何參數

+0

'arr [0](some_int_stuff,some_other_int_stuff);'工作正常。 – Lundin

相關問題