函数指针上的未知类型F TYPE

时间:2014-02-17 19:33:41

标签: c

#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程序中遇到上述错误。找不到错误的原因。

2 个答案:

答案 0 :(得分:2)

  1. Typedef语句看起来就像变量声明一样,前缀为typedef。类型的名称与变量名称所在的位置相同,因此它应为typedef void (*FNTYPE)(void) ;而不是typedef void (*fn)(void) FNTYPE;

  2. 您无法在函数外部对数组执行赋值,无论是在函数中还是在数组初始化中执行。

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

答案 1 :(得分: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;
    
  4. 直播:http://ideone.com/vbandN