从不兼容指针类型传递参数
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改变二话不说。
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);
下面是有关于函数指针创建类型定义良好的信息问题的链接:
line 153:dll_states [link] .data.wifi = dll_wifi_new_state(link, up_from_dll, true/* is_ds * /); – user2398101
结构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
dll_wifi_state调用up_from_dll()将数据包从数据链路层传递到下一层。 'seq'数字是在接收下一层之前检查收到的味精是否是预期的味精。 – user2398101
我现在明白了,并用清晰的答案更新我的答案WER。 – xaxxon