2014-02-17 3 views
0
#include<stdio.h> 
#include<stdlib.h> 

typedef void (*fn)(void) FNTYPE; 
FNTYPE fn_arr[5]; 

void fun1(void){ 
     printf("\n I'm func 1 \n"); 
} 

void fun2(void){ 
     printf("\n I'm func 2 \n"); 
} 


fn_arr[0] = &fun1; 
fn_arr[1] = &fun2; 

int decidefunc(char* inp){ 
     if(inp == NULL){ 
       return 0; 
     } 
     else if(*inp == "a"){ 
       return 1; 
     } 
     else if(*inp == "b"){ 
       return 0; 
     } 
     else if(*inp == "c"){ 
       return 1; 
     } 
     else{ 
       return 0; 
     } 
} 

void callMyFunc(char* inp){ 
     printf("\n %s \n",__func__); 
     int idx = decidefunc(inp); 
     fn_arr[idx](); 
} 

void do_lengthy_op(char* inp,void (*call)(char *inp)){ 
     printf("\n do_lengthy_operation! \n"); 
     call(inp); 
} 

int main(){ 
     do_lengthy_op("b",callMyFunc); 
     return 0; 
} 

Я получаю вышеуказанную ошибку для простых программ c при обратном вызове. Не удалось найти причину ошибки.Unknow type FNTYPE по указателям функций

ответ

2

Он должен работать после устранения следующих проблем.

  1. Для определения pointer-to-function типа, вы должны использовать вместо следующих:

    typedef void (*FNTYPE)(void); 
    
  2. Для корректного сравнения char, вам необходимо изменить

    else if(*inp == "a"){ 
        return 1; 
    } 
    else if(*inp == "b"){ 
        return 0; 
    } 
    else if(*inp == "c"){ 
        return 1; 
    } 
    

    в

    else if(*inp == 'a'){ 
        return 1; 
    } 
    else if(*inp == 'b'){ 
        return 0; 
    } 
    else if(*inp == 'c'){ 
        return 1; 
    } 
    
  3. Переместите следующее в main(), поскольку у вас нет Code outside functions.

    fn_arr[0] = &fun1; 
    fn_arr[1] = &fun2; 
    

Смотрите вживую: http://ideone.com/vbandN.

2
  1. заявление Typedef выглядит точно так же, как объявление переменной, с префиксом typedef. Имя типа находится в том же месте, где имя переменной будет, поэтому она должна быть typedef void (*FNTYPE)(void) ; не typedef void (*fn)(void) FNTYPE;

  2. Вы не можете выполнить задание массива вне функции, либо сделать это в функции или в инициализация массива.

    fn_arr[0] = &fun1; 
    fn_arr[1] = &fun2; 
    
Смежные вопросы