2017-06-13 21 views
0

JSON設定ファイルで定義されている多くのmodbusデバイスを扱うための汎用アプリケーションを作成します。 mbus_servers my_modbus_init()の内容で使用されるstructは、デバイスとポートのipです。mallocの使い方

my_modbus_initで1 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のdynamiclly割り当てられた数を初期化しよう:

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を使用しますか?代わりmodbus_tオブジェクトの配列を有する

+0

@SHG、その後のsizeofは、あまりにも動作します。 – tilz0R

+1

@ tilz0R必ずしもそうではありません。それは前方宣言しか持たないかもしれない。 typedefは知られていますが、元の構造体が分かっていないためサイズがわかりません。 – SHG

答えて

0

は、ポインタ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つのmodbusのメモリを1つの行に割り当て、その後forループを使用してそれにアドレスを割り当てたいとします。 – tilz0R

+1

@ tilz0R 'modbus_t'は(FILE'のように)不透明な型であるため、他の方法では使用できません。さらに、 'modbus_t'オブジェクトを作成するために使用される関数は実際には*ポインタ*を返します。したがって、ポインタの配列を持つことは理にかなっています。オブジェクトへのポインタの配列をループすることは、オブジェクトの配列をループすることと変わりありません。 –