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 link,const char * data,size_t length,int seq)。一旦我添加了这个参数,就会出现以下错误< / p>
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 :(得分:2)
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);
这是一个问题的链接,该问题包含有关为函数指针创建typedef的良好信息: