如何malloc modbus_t

如何malloc modbus_t

问题描述:

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

在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; 
} 

现在我尝试初始化dynamiclly分配数量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}’ 
} 

有什么办法创造尽可能多的modbus_t根据需要使用malloc?

+0

@SHG随后的sizeof将工作太。 – tilz0R

+1

@ tilz0R不一定。它可能只有一个前向声明。然后,typedef是已知的,但不是它的大小,因为原始结构未知。 – SHG

而不是有一个modbus_t对象的数组,有一个指针modbus_t对象的数组。这是有道理的,因为my_modbus_init函数(和它调用的modbus_new_tcp函数)返回指针。

换句话说,改变sizeof(modbus_t)sizeof(modbus_t *)。并且改变变量my_modbus来表示这个指针数组(即是一个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); 
} 
+2

这意味着'modbus_t ** my_modbus;' – LPs

+0

不,从代码中可以看出,他希望为一行中的3个modbuses分配内存,然后使用for循环来解决它。 – tilz0R

+1

@ tilz0R由于'modbus_t'是一个不透明的类型(如'FILE'),所以不可能有任何其他方式。此外,用于创建'modbus_t'对象的函数实际上返回*指针*,因此拥有一组指针是有道理的。遍历一个指向对象的指针数组与循环对象数组没有区别。 –