0

我编写通用应用程序来处理 JSON 配置文件中定义的尽可能多的 modbus 设备。在 my_modbus_init() 中使用的 mbus_servers 结构内容设备和端口的 ip。

my_modbus_init() 中一个 modbus_t 的初始化如下所示:

modbus_t * my_modbus_init(const char * ip_s, int port, int slave_id)
{
    modbus_t *ctx;


    ctx = modbus_new_tcp(ip_s, port);
    if(ctx == NULL)
    {
      printf("Error");
    }

    modbus_set_debug(ctx, 0);

    if (modbus_connect(ctx) == -1)
    {
        fprintf(stderr, "Connection failed: %s\n",modbus_strerror(errno));
        modbus_free(ctx);
        return NULL;
    }

    modbus_set_slave(ctx, slave_id);

    return ctx;
}

现在我尝试初始化动态分配的 modbus_t 数量:

modbus_t * my_modbus;
int quantity_of_connections_modbus = 3;

my_modbus = (modbus_t *) malloc (quantity_of_connections_modbus * sizeof(modbus_t));
                                                                  ^here I get invalid application of ‘sizeof’ to incomplete type ‘modbus_t' (I know that is because i dont have acces to definition of modbus_t [it is defined in modbus.h as typedef struct _modbus modbus_t; ])

for(i=0; i< quantity_of_connections_modbus; i++)
{
  // |> my_modbus[i] = my_modbus_init(mbus_servers[i]->host,mbus_servers[i]->port,MBUS_SLAVE); 
  // |- And here error: dereferencing pointer to incomplete type ‘modbus_t {aka struct _modbus}’ 
}

有什么方法可以使用 malloc 创建尽可能多的 modbus_t 吗?

4

1 回答 1

0

与其拥有一个modbus_t对象数组,不如拥有一个指向对象的指针数组modbus_t。这是有道理的,因为my_modbus_init函数(及其modbus_new_tcp调用的函数)返回指针。

换句话说,更改sizeof(modbus_t)sizeof(modbus_t *). 并更改变量my_modbus来表示这个指针数组(即是 a modbus_t **)。


问题中的代码进行了相应修改:

modbus_t ** my_modbus;
int quantity_of_connections_modbus = 3;

my_modbus = malloc (quantity_of_connections_modbus * sizeof(modbus_t*));

for(i=0; i< quantity_of_connections_modbus; i++)
{
  my_modbus[i] = my_modbus_init(mbus_servers[i]->host,mbus_servers[i]->port,MBUS_SLAVE); 
}
于 2017-06-13T06:45:48.373 回答