2017-06-13 3 views
0

J'écris une application générique pour gérer autant de périphériques modbus que ceux définis dans le fichier de configuration JSON. mbus_servers struct utilisé dans my_modbus_init() contenu ip de l'appareil et du port.Comment malloc modbus_t

Initialisation d'un modbus_t dans my_modbus_init() ressemble à ceci:

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

Maintenant, j'essaie d'initialiser dynamiclly attribué le numéro de 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}’ 
} 

Est-il possible de créer autant de modbus_t au besoin en utilisant malloc?

+0

@SHG alors sizeof fonctionnerait aussi. – tilz0R

+1

@ tilz0R Pas nécessairement. Il pourrait seulement avoir une déclaration avant. Ensuite, le typedef est connu mais pas sa taille, car la structure d'origine n'est pas connue. – SHG

Répondre

0

Au lieu d'avoir un tableau de modbus_t objets, ont un tableau de pointeurs à modbus_t objets. Cela a du sens puisque la fonction my_modbus_init (et la fonction modbus_new_tcp appelée) renvoie des pointeurs. En d'autres termes, remplacez sizeof(modbus_t) par sizeof(modbus_t *). Et changez la variable my_modbus pour représenter ce tableau de pointeurs (c'est-à-dire modbus_t **).


Le code de la question modifiée en conséquence:

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

Cela implique 'modbus_t ** my_modbus;' – LPs

+0

Non, vu de code, il veut allouer de la mémoire pour 3 modbus dans une rangée, puis en utilisant pour la boucle pour l'adresser. – tilz0R

+1

@ tilz0R Puisque 'modbus_t' est un type opaque (comme' FILE'), ce n'est pas possible autrement. De plus, les fonctions utilisées pour créer l'objet 'modbus_t' retournent en fait * des pointeurs *, donc avoir un tableau de pointeurs a du sens. Boucler sur un tableau de pointeurs vers des objets n'est pas différent de boucler sur un tableau d'objets. –