从不兼容指针类型传递参数

问题描述:

static struct dll_wifi_state **dll_states; 

    enum dll_type { 
     DLL_UNSUPPORTED, 
     DLL_ETHERNET, 
     DLL_WIFI 
    }; 

    struct dll_state { 
     enum dll_type type; 

     union { 
     struct dll_eth_state *ethernet; 
     struct dll_wifi_state *wifi; 
     } data; 
    }; 

    static struct dll_state *dll_states = NULL; 

struct dll_wifi_state { 
    int link; 

    // A pointer to the function that is called to pass data up to the next layer. 
    up_from_dll_fn_ty nl_callback; 

    bool is_ds; 

}; 

这是指针正在dll_wifi_state结构中传递的方法。从不兼容指针类型传递参数

static void up_from_dll(int link, const char *data, size_t length) 
{ 
//some code here 
} 

在其他文件中,我调用此方法

void reboot_accesspoint() 
{ 
    // We require each node to have a different stream of random numbers. 
    CNET_srand(nodeinfo.time_of_day.sec + nodeinfo.nodenumber); 

    // Provide the required event handlers. 
    CHECK(CNET_set_handler(EV_PHYSICALREADY, physical_ready, 0)); 

    // Prepare to talk via our wireless connection. 
    CHECK(CNET_set_wlan_model(my_WLAN_model)); 

    // Setup our data link layer instances. 
    dll_states = calloc(nodeinfo.nlinks + 1, sizeof(struct dll_state)); 

    for (int link = 0; link <= nodeinfo.nlinks; ++link) { 
    switch (linkinfo[link].linktype) { 
     case LT_LOOPBACK: 
     dll_states[link].type = DLL_UNSUPPORTED; 
     break; 

     case LT_WAN: 
     dll_states[link].type = DLL_UNSUPPORTED; 
     break; 

     case LT_LAN: 
     dll_states[link].type = DLL_ETHERNET; 
     dll_states[link].data.ethernet = dll_eth_new_state(link, up_from_dll); 
     break; 

     case LT_WLAN: 
     dll_states[link].type = DLL_WIFI; 
     dll_states[link].data.wifi = dll_wifi_new_state(link, 
                 up_from_dll, 
                 true /* is_ds */); 
     break; 
    } 
    } 

    // printf("reboot_accesspoint() complete.\n"); 
} 

它工作正常,像这样的,但我想添加另一种说法,即up_from_dll((INT链接,为const char *的数据,为size_t长度,INT SEQ),而一旦我补充这样的说法,下列错误启动上来

ap.c:153: warning: passing argument 2 of ‘dll_wifi_new_state’ from incompatible pointer type 

是否有增加的另一种说法于法没有得到错误???我与指针非常糟糕的一种方式: (

任何帮助将不胜感激。

153线:

dll_states[link].data.wifi = dll_wifi_new_state(link, 
                  up_from_dll, 
                  true /* is_ds */); 

和方法

struct dll_wifi_state *dll_wifi_new_state(int link, 
              up_from_dll_fn_ty callback, 
              bool is_ds) 
{ 
    // Ensure that the given link exists and is a WLAN link. 
    if (link > nodeinfo.nlinks || linkinfo[link].linktype != LT_WLAN) 
    return NULL; 

    // Allocate memory for the state. 
    struct dll_wifi_state *state = calloc(1, sizeof(struct dll_wifi_state)); 

    // Check whether or not the allocation was successful. 
    if (state == NULL) 
    return NULL; 

    // Initialize the members of the structure. 
    state->link = link; 
    state->nl_callback = callback; 
    state->is_ds = is_ds; 

    return state; 
} 

我还没有从增加新的参数,以up_from_dll改变二话不说。

+0

我现在明白了,并用清晰的答案更新我的答案WER。 – xaxxon

dll_wifi_new_state的第二个参数是up_from_dll_fn_ty callback

它现在不在你的代码上市,但up_from_dll_fn_ty是一个typedef说,up_from_dll_fn_ty是具有特定参数的函数指针(不包括int seq

当你更新up_from_dll使用不同的参数,它不再与up_from_dll_fn_ty指定的类型匹配,并且期望作为dll_wifi_new_state的第二个参数。你需要将参数添加到up_from_dll_fn_ty,你应该很好。

如果您发布了up_from_dll_fn_ty的定义,它会使问题具有所有信息,并且如果您仍然需要,可以让我提供更多帮助。

你正在寻找的东西,如:

typedef void (*up_from_dll_fn_ty)(int link, const char *data, size_t length); 

,并更改为

typedef void (*up_from_dll_fn_ty)(int link, const char *data, size_t length, int seq); 

下面是有关于函数指针创建类型定义良好的信息问题的链接:

Understanding typedefs for function pointers in C

+0

line 153:dll_states [link] .data.wifi = dll_wifi_new_state(link, up_from_dll, true/* is_ds * /); – user2398101

+0

结构dll_wifi_state * dll_wifi_new_state(INT链路, up_from_dll_fn_ty回调, 布尔is_ds) { 如果(联系> nodeinfo.nlinks || linkinfo [链接] .linktype!= LT_WLAN) 返回NULL; struct dll_wifi_state * state = calloc(1,sizeof(struct dll_wifi_state)); if(state == NULL) return NULL; //初始化结构的成员。 state-> link = link; state-> nl_callback = callback; state-> is_ds = is_ds; 返回状态; } – user2398101

+0

dll_wifi_state调用up_from_dll()将数据包从数据链路层传递到下一层。 'seq'数字是在接收下一层之前检查收到的味精是否是预期的味精。 – user2398101