Quel est la limite d'un objet

Bonjour à tous,

J'essaye de travailler avec un objet en partant de cet exemple:

struct MyObject {
  float field1;
  byte field2;
  char name[10];
};

//Data to store.
  MyObject customVar = {
    3.14f,
    65,
    "Working!"
  };

J'ai donc créé mon objet:

struct MyUrl {
	char id[IMEISIZE];
	char hour[9];
	char valid[7];
	char lat[6];
	char latn[2];
	char lon[5];
	char lone[2];
	char speed[8];
	char heading[10];
	char batt[7];
	char desc[7];
	char gpsloc[20];
	char gsmloc[24];
	char time[12];
};

et maintenant, je lui donne des valleurs:

MyUrl url = {
            "?id=",
            "&hour=",
            "&hdop",
            "&lat=",
            //"&latn=",
            //"&lon=",
            //"&lone=",
            //"&speed=",  
          };

Le problème qui se pose, c'est que lorsque je décomment ceci

//"&latn=",

et que je compile, je recois ce message d'erreur:

/Users/pierrot/Documents/Arduino/libraries/Wi808/Wi808.cpp: In member function 'int WI808::sendHTTP(char*)':
/Users/pierrot/Documents/Arduino/libraries/Wi808/Wi808.cpp:1251:11: error: initializer-string for array of chars is too long [-fpermissive]
};
^
Erreur lors de la compilation.

Es-ce qu'il y a une limite dans le nombre de char ou de caratères?
Comment puis-he faire autrement ou correctement?

Merci pour vos lumières!

En fait, je crois que j'ai compris mon erreur,
ici:

char lon[5];

j'aurais du mettre

char lon[6];

J'ai pu continuer à décommenter la suite.

Mais si vous avez un meilleurs suggestion, je suis prenneur!

salut
Oui, tu essai de mettre 7 caractères (avec le 0 de terminaison de chaîne de caractère) dans 2 cases mémoire, il te faut donc au moins 1 octet de plus que la longueur de ta chaîne.

Par contre, je ne comprends pas a quoi va te servir cette structure. Si c'est pour construire ton URL directement, ça ne va pas fonctionner car tu ne pourras pas y insérer les valeurs, Il te faudrait aussi créer des variables pour la valeur de chaque paramètres. Mais il faut que les valeurs aient toujours le même nombre de caractères.

En fait le problème que j'ai c'est que je suis à 95% de ma mémoire

Le croquis utilise 29 308 octets (95%) de l'espace de stockage de programmes.

J'essaye de remplacer ceci

_cell.print(F("&spped="));

par

_cell.print(url.spped);

Pour le momenet, j'ai remplacé 7 paramères de mon URL et j'ai gagné de la place, mais je ne l'ai pas encore testé.

Ce qui me surprend, et m'arrange, c'est que si je prend ceci

struct MyUrl {
	char id[IMEISIZE];
	char hour[9];
...

Si je mets 1 à la place de 9 ou 100 à la place de neuf, je ne vois pas de différence d'octet utilisé par mon croquis.

Donc es-ce que je pourrais remplace

char fix[100];

par

struct MyFix {

  char position[100];
};

//Data to store.
  MyFix fix = {
    "Working!"
  };

Ca me parrait trop facile pour que ca soit possible,

Je t'avoue est un très grand novice concernant les structures

Aussi, dlcouvrant ceci, je me dis que je pourrais utiliser les objects pour structurer mes données récoltées et à traiter. Mais je suis un peu dans le flou... :slight_smile:

pierrot10:
Ca me parrait trop facile pour que ca soit possible,

Ce n'est effectivement pas possible. Si la taille de ta structure augmente, la taille mémoire utilisée augmente et ça se voit à la compilation.

Par contre si tu n'utilises pas ta structure dans ton programme, le compilateur (qui est très intelligent) ne va pas l'instancier et donc la taille mémoire utilisée ne va pas varier.

D'accord, mais donc si dans mon programme, je fais ceci

MyFix fix;
Serial.println(fix.position);

là je vais voir la taille mémoire augmenter. C'est bien ca ce que tu veux dire?

Mais quel est l'aventage d'une structur, si ce n'est que d'utiliser un objet?

oui c'est ça
L'avantage d'une structure c'est entre autre de regrouper tous les attributs d'un objet et aussi de pouvoir le manipuler dans sa globalité (par exemple: passer l'objet ou son adresse en paramètre plutôt que chaque membre), etc.

Ok alors je pense que je vais essayer de travailler avec une structure. En enffet, je vous un aventage, surtout que ca me permetterais d'éliminer pas mal de

  strncat(fix,get_val,10);
        strncat(fix,",",1);

Je crois que strncat() prend pas mal de ressource, non?

Je pense que de toute manière ca va simplier mon code en espérant que je vais gagner de la mémoire.

Autre chose,
dans mon fichier wi808.h, mas structure je dois la déclarer dans ma classe ou avant ma class.

Pour le moment, je l'ai fait ainsi

struct TheFix {
 String hour;
 String valid;
 String lat;
 String latn;
 String lon;
 String lone;
 String spped;
 String course;
 String date;
 String magnetism;
 String mode;
 char position[FIXSIZE];

};

struct MyUrl {
 char id[IMEISIZE];
 char valid[7];
 char lat[6];
 //char latn[2];
 char lon[6];
 //char lone[2];
 char speed[8];
 char heading[10];
 char batt[7];
 char desc[7];
 char gpsloc[20];
 char gsmloc[24];
 char time[14];
};



 class WI808{
 protected:
 

 private:


 public:
 WI808();
 
 };

Es-ce que 'structur TheFix' doit etre là ou il est, ou je devrais l'avoir dans public ou private ?

Dans le fond, ca pas trop de sens ce que j'ai écris

Je crois que strncat() prend pas mal de ressource, non?

Par ce que je devrai de toute manière utiliser memcpy() pour attributer une valeur à

position de TheFix

memcpy(fix.position,var,5)

(var étant un char, avec une valeur)

Autre chose: tu ne verras la mémoire utilisée par l’objet à la compilation que s’il est static, c’est à dire déclaré en dehors des fonctions ou déclaré ‘static’ dans une fonction.

dans mon fichier wi808.h, mas structure je dois la déclarer dans ma classe ou avant ma class.

Ca dépend de ton programme, si le structure doit être utilisée uniquement par la classe, il vaut mieux la déclarer à l'intérieur
Maintenant si elle est déclarée à l'intérieur de la classe, ça ne veux pas dire qu'elle ne pourra pas être utilisée à l'extérieur si elle est déclarée 'public'

En fait le problème que j'ai c'est que je suis à 95% de ma mémoire

Bonjour,
alors juste une petite remarque, dans ce cas il peut être envisagé de changer de plateforme