指向函数指针的空指针作为参数传递

时间:2021-03-08 15:11:11

标签: c++ pointers arguments parameter-passing void

我在下面有一个接受以下参数的函数

struct coap_s *sn_coap_protocol_init(void *(*used_malloc_func_ptr)(uint16_t), void (*used_free_func_ptr)(void *), uint8_t (*used_tx_callback_ptr)(uint8_t *, uint16_t, sn_nsdl_addr_s *, void *),                                   int8_t (*used_rx_callback_ptr)(sn_coap_hdr_s *, sn_nsdl_addr_s *, void *param))

所以我试图分别将以下四个函数作为参数传递

void* CoApClient::coap_malloc(uint16_t size)
{
    return malloc(size);
}
void CoApClient::coap_free(void* addr)
{
    free(addr);
}


uint8_t CoApClient::coap_tx_cb(uint8_t *data, uint16_t len, sn_nsdl_addr_s *addr, void *param)
{
    uint16_t id = data[3] | (data[2] << 8);
    if (_txCallback) 
    {
        _txCallback(data,len, 100);
    }
    
    return 0;
}

int8_t CoApClient::coap_rx_cb(sn_coap_hdr_s *packet, sn_nsdl_addr_s *addr, void *param)
{
    printf("Failed to send message with ID %d. Error: %d\n", packet->msg_id, packet->coap_status);
    CoApClient::failedMsgs++;
    uint16_t packet_len = sn_coap_builder_calc_needed_packet_data_size(packet);
    uint8_t* packet_ptr = (uint8_t*)malloc(packet_len);
    //Build message address information
    sn_nsdl_addr_s dst_addr_ptr;
    dst_addr_ptr.type = SN_NSDL_ADDRESS_TYPE_IPV4;
    dst_addr_ptr.addr_ptr = (uint8_t*)addr->addr_ptr;
    dst_addr_ptr.addr_len = addr->addr_len;
    dst_addr_ptr.port = addr->port;
    //keep retrying the failed message
    // if( sn_coap_protocol_build(coapHandle,&dst_addr_ptr,packet_ptr,packet,0) > 0)
    // {
    //     if (_txCallback) 
    //     {
    //         _txCallback(packet_ptr,packet_len, 100);
    //     }
    // }      
   
    return 0;
}

但我收到此错误.. CoApClient.cpp@34,41:ISO C++ 禁止将未限定或带括号的非静态成员函数的地址作为指向成员函数的指针。说 '&CoApClient::coap_malloc' [-fpermissive] [错误] CoApClient.cpp@34,55:ISO C++ 禁止将未限定或带括号的非静态成员函数的地址作为指向成员函数的指针。说 '&CoApClient::coap_free' [-fpermissive] [错误] CoApClient.cpp@34,67:ISO C++ 禁止将未限定或带括号的非静态成员函数的地址作为指向成员函数的指针。说 '&CoApClient::coap_tx_cb' [-fpermissive] [错误] CoApClient.cpp@34,80:ISO C++ 禁止将未限定或带括号的非静态成员函数的地址作为指向成员函数的指针。说 '&CoApClient::coap_rx_cb' [-fpermissive] [错误] CoApClient.cpp@34,40:无法转换'void* (CoApClient::)(uint16_t)' {aka 'void (CoApClient::)(short unsigned int)' } 到 'void ()(uint16_t)' {aka 'void (*)(short unsigned int)'}

那是在我在 CoAPClient 类的构造函数中执行此操作之后

CoApClient::CoApClient()
{
    // Initialize the CoAP protocol handle, pointing to local implementations on malloc/free/tx/rx functions
    coapHandle = sn_coap_protocol_init(&coap_malloc, &coap_free, &coap_tx_cb, &coap_rx_cb);
    
}

我不太确定为什么会出现这种情况,我很感激我在这里出错的地方

0 个答案:

没有答案