2017-06-13 61 views
0

我寫的通用應用程序處理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

回答

0

而不是有一個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'對象的函數實際上返回*指針*,因此擁有一組指針是有道理的。遍歷一個指向對象的指針數組與循環對象數組沒有區別。 –