Mon code bug quand il appel un varaiable de type Structure

Bonjour à tous,

J’ai un code qui va sauver des valeur dans une structure

typedef struct Value {
    char  *varName;
    char  *ctext;
    float varValue;
} Value;

Dans mon contructuer, j’ai aussi aussi et il utlise Malloc et j’aime pas trop…

#define MAX_VALUE 9
val = (Value *)malloc(MAX_VALUES*sizeof(Value));

Dans mon code, il fait appel à cette fonction, pui la dernière envoie les données au serveur distant

fona.ubidotsAdd("imei", 123, imei);
fona.ubidotsAdd("valid", 1);
fona.ubidotsAdd("latitude", latitude);
fona.ubidotsAdd("longitude", longitude);
fona.ubidotsAdd("battery", battery);
fona.ubidotsAdd("localisation",0, "GSM");
fona.ubidotsAdd("tower", 0, celltower0);
fona.ubidotsAdd("timestamp", 0, timestamp);

Serial.println(F("Sending to Ubidots"));
fona.ubidotsSendAll(TOKEN);

Ca fonctionne. Le tout est bien envoyé.

NB: A savoir quand ubidotsSendAll() return true, ‘currentValue’ prend la valeur de 0;

Mais voilà, quand mon code dans loop() recommence et il repasse par les fonctions

il plante dès qu’il rencontre la premiere

fona.ubidotsAdd("imei", 123, imei);

[...]

Voici le code de ubidotsAdd()

void Adafruit_FONA::ubidotsAdd(char *variable_id, float value, char *ctext1) {
  
    Serial.print(F("Ubidots: "));
    Serial.print(variable_id);
    Serial.print(F(", ")); Serial.print(value);
    Serial.print(F(", ")); Serial.println(ctext1);
    
    (val+currentValue)->varName = variable_id;
    (val+currentValue)->ctext = ctext1;
    (val+currentValue)->varValue = value;
    currentValue++;
    if (currentValue > MAX_VALUES) {
        currentValue = MAX_VALUES;
    }

}

NB: A savoir quand ubidotsSendAll() return true, ‘currentValue’ prend la valeur de 0;

Je ne sais pourquoi, mais je pense que les valeur enregistré dans ‘val’ ne sont pas effacée et il doit avoir un problème de saturation.

En fait, je vous dis honnetement, ce code n’est pas le mien et je l’ai repris et je ne comprends pas trop (val+currentValue) . Je ne connais pas trop les Structure (Struct)

Je pense qu’il vous manque des infos pour m’aider, alors n’hésitez pas demande ce qu’il vous manque.

Je me demande aussi comment faire autrement pour que à chaque fois que Adafruit_FONA::ubidotsAdd() est appelé, il garde les données dans une stuct jusqu’à ce qu’elles ont été traité et peuvent être détruite…

Est-ce que Malloc est indispensable?

¨Voili, voilà… :o

http://snippets-r-us.com

Le malloc alloue de la mémoire pour MAX_VALUES struct (d'ailleurs avec l'accès val+currentValue alors que currentValue = MAX_VALUES; est possible, c'est très louche.... (puisqu'on va jusqu'à MAX_VALUES-1)

Votre Struct est bizarre - pourquoi avez vous 2 fois le mot Value ? Est-ce que vous voyez la différence entre le premier et le second ? (Cf ce lien par exemple ou celui là)

Bonjour,

Quelle drôle d'idée de jouer avec des pointeurs alors qu'il suffit de déclarer un tableau
A la place de Value* val = (Value *)malloc(MAX_VALUES*sizeof(Value));
Il suffit de déclarer Value *val=new Value[MAX_VALUES];
ou Value val[MAX_VALUES]; si on n'a pas besoin d'allocation dynamique

Ensuite
au lieu de (val+currentValue)->varName = variable_id;
il suffit d'y accéder par val[currentValue].varName=variable_id; c'est quand même plus clair.

Pour répondre à la question malloc est il indispensable je dirais que:

  • en C++ il faut utiliser new qui alloue directement les objets (pas besoin de calculer leur taille), mais surtout appelle le constructeur.
  • on n'a pas besoin d'allocation dynamique pour un objet qui va persister pendant tout le programme, il suffit de le déclarer statiquement, et ça permet de mieux se rendre compte de la mémoire utilisée à la compilation.

il suffit d'y accéder par

val[currentValue].varName=variable_id;

Et c'est là qu'on se rend compte comme dit ci dessus que si currentValue = MAX_VALUES alors on est hors tableau...

Bonjour,
Je vous remercie pour ces précieuses informations. Je vais revoir mon code pour aller dans votre sens. Je trouvais aussi quelque chose de louche.

Merci

Attention aussi avec les pointeurs vers les chaînes de caractère. On ne voit pas le code ni ce que ça fait mais assurez vous que les chaînes soient persistantes pendant la durée nécessaire

Effectivement, ça peut être une source de problèmes potentiels qui peuvent être difficiles à cerner.