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

时间:2013-05-19 03:17:49

标签: c pointers arguments incompatibletypeerror

    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之外,我没有改变任何其他内容。

1 个答案:

答案 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的良好信息:

Understanding typedefs for function pointers in C