Comment peut-on fusionner des valeurs autrement qu'avec strcat()

Bonjour bonjour à tous,

Je pouvais concatener des valeur avec la fonction strcat(), ou strncat()

Cependant, je “rempli” une varaible avec sprintf comme ceci

sprintf(coords,"<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>",cou,lon,lat,alt,tim,vel,sta,ind);

Le binz, c’est que ce bout de code est dans une boucle for, et dans certain cas, il doit s’ajouter d’autre ligne, comme celle ci-dessus et je ne dois pas écraser la valeur existante de “coords”, mais y ajouter.

J’ai essayé avec strcat, un peu comme ca

strcat(coords,sprintf(coords,"<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>",cou,lon,lat,alt,tim,vel,sta,ind);)

mais évidement, la valeur en deuxième parametre coince.

Comment puis-je alors concatener ces valeurs dans coords?

M’avez-vous compris?

Milles mercis pour vos lumières

J’ai l’impression que tu pars dans tous les sens. Dans deux autres fils tu pleures après quelques octets et là tu veux concaténer des chaînes de la mort.
La programmation c’est pas j’ajoute tout un tas de trucs et quand ça plante je me pose des questions.
Il faut une vrai réflexion en amont:
quelles données tu vas utiliser
dans quelles conditions
comment tu vas les exploiter par la suite

Si tu es toujours avec ton histoire de données qui se sont accumulées et qu’il faut envoyer. Envoies les par paquet. Dans un processeur avec si peu de RAM, il est complètement illusoire de vouloir balancer d’un coup un buffer de taille importante d’autant que si tu as accumulé tes données pendant 1 heure comme tu le disais dans un autre fil le buffer va complètement exploser ta mémoire…

Salut fdufnews

Dans deux autres fils tu pleures après quelques octets et là tu veux concaténer des chaînes de la mort

:slight_smile: :slight_smile: Oui je comprend ta remarque. En effet, je suis limite avec la mémoire mais j’ai encore de la marge. Le problème c’est que j’essaye d’envoye plusieurs set de donnée en une fois pour “vider” mon EEPROM. Et le set de donnée et cette chaine de la mort, et la j’ai pas le choix car c’est ces valeur que je souhaite enregistré sur ma base de donné. Si j’ai encore assez de RAM, ben je souhaite envoyé deux set avec des valeurs différente, Si j’ai encore de la mémoire, et ben j’envoie 3 set de valeur ainsi de suite.

C’est pourquoi je souhaitais que ma variable “coords” prenne cette valeur dans le cas de deux set. (en ademttant que les %s seront remplacer par les valeurs

<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>

et sil y a encore de la place, 3 set

<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>
<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>

C’est pourquoi je cherche à savoir comment merger des donnée, pour voir ce que ca donne.

Je me suis à l’évidence que je n’arriverai pas envoyé une heure d’enregistrement, en seul coup. Quoi du moins, je n’ai pas trouver la solution alors je m’adapte.

Alors si toute les 30 sec j’enregistre 1 set de valeur dans ma memoire, et si toutes les 10 sec, j’envoie 3 set sur le serveur, je viderai rapidement mon EEPROM. Mais ceci dans le cas ou il y a eu une longue absence de réseau. Si non , j’enregstre, j’envoi, j’envoi rien, j’envoi rien, j’enregistre, j’envoi rien, j’envoi rien, etc

C’est vrai qu’au départ, je souhaite, récolté 5 set, ou plus (un tous les 30 sec), et envoyer les 5 d’un coup. mais je me suis mis à l’évidence qu’em terme de mémoire , c’était mission imposible.

Surtout que je ne vois pas du tout l’utilité de l’EEPROM : si c’est pour tout recopier en entier dans la RAM ensuite, ça ne sert strictement à rien, autant tout stocker dans la RAM dès le début …

En plus je ne vois absolument pas ce qui t’empêche d’envoyer tes données un message à la fois : j’ai du réseau ? ==> envoi premier message ==> toujours du réseau ? ==> envoi message suivant etc … ça reviendra exactement au même ! En plus c’est plus fiable : si ta captation est de courte durée, la transmission d’un gros paquet pourrait être bloquée en cours (=0% de transmis) alors que tu en aurais transmis 80% en petits paquets.

Surtout que je ne vois pas du tout l'utilité de l'EEPROM : si c'est pour tout recopier en entier dans la RAM ensuite, ça ne sert strictement à rien, autant tout stocker dans la RAM dès le début ...

Ben j'utilise un EEPROM dans le cas ou je n'ai pas de réseau, mais les positions GPS sont valable avec l'antenne GPS. Dans ca cas, je ne veux pas les perdre et je les enregistre dans l'EEPROM, jusqu'a ce que le réseau est valable. Il faudrait alors envoyer plus de donnée pour quel l'EPROM se retrouve avec le minimum d'enregistrement et avant qu'on turnoff le module

pierrot10:

Surtout que je ne vois pas du tout l'utilité de l'EEPROM : si c'est pour tout recopier en entier dans la RAM ensuite, ça ne sert strictement à rien, autant tout stocker dans la RAM dès le début ...

Ben j'utilise un EEPROM dans le cas ou je n'ai pas de réseau, mais les positions GPS sont valable avec l'antenne GPS. Dans ca cas, je ne veux pas les perdre et je les enregistre dans l'EEPROM, jusqu'a ce que le réseau est valable. Il faudrait alors envoyer plus de donnée pour quel l'EPROM se retrouve avec le minimum d'enregistrement et avant qu'on turnoff le module

Ca ne change pas mes propos ... A moins d'un reset ou d'une modification volontaire tes données reste en RAM. La, tel que tu fonctionnes, ton EEPROM est inutile

ok, bon dans tous les cas, si je n’ai pas de réseau pour envoyer les données il faut bien que je les stok a quelque part. De plus, actuellement, il me reste 500o de la RAM du Arduino, et ceci va encore diminuer.

Ceci dit, je suis toujours face au meme même problème pour fusionner des données comme le fait strcat()

en plus simple:
J’ai une valeur das la variable, et je dois àjouter, mais pas remplacer ceci à coords

// Ceci va l'écraser, mais je veux ajouter
sprintf(coords,"<fix><co><%s</co><lo>%s</lo></fix>",cou,lon);

pierrot10:
ok, bon dans tous les cas, si je n’ai pas de réseau pour envoyer les données il faut bien que je les stok a quelque part. De plus, actuellement, il me reste 500o de la RAM du Arduino, et ceci va encore diminuer.

Oui mais dans tous les cas, puisque tu tiens à ne pas fractionner tes messages, tu vas être forcement bloqué puisque tu vas devoir recopier tout ce qui est dans ton eeprom dans la ram. Donc si tu n’as pas assez de ram, tu ne peux pas concaténer, donc obliger de fractionner. Si tu as assez de ram, l’eeprom est inutile puisque tu ne vas que recopier ce qui est l’eeprom dans la ram où tu aurais pû stocker tes données dès le départ …

pierrot10:
Ceci dit, je suis toujours face au meme même problème pour fusionner des données comme le fait strcat()

en plus simple:
J’ai une valeur das la variable, et je dois àjouter, mais pas remplacer ceci à coords

// Ceci va l'écraser, mais je veux ajouter

sprintf(coords,"<%s%s",cou,lon);




Pour strcat il faut faire 1 par 1
strcat(coords,"<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>");
strcat(coords,cou);
strcat(coords,lon);
...

mais coords doit être capable d’accueillir tout le monde, donc il faut de la RAM …

Je me’excuse B@atto, mais je vais encore te tenir tête :slight_smile: :slight_smile: :slight_smile: :slight_smile:
Peut etre que je me suis mal expliqué, ou peut etre que je t’ai pas compris à 100% et je m’en excuserai.

En fait, je me suis mis dans le cas ou j’était en montage, par exemple. La haut, il y a peu de chance d’avoir du réseau 3G, mais il y aura du GPS.
Si je me promene 1h à 3h, il faut que mon module garde les positions. Sopit pour une heure, c’est
120x ca (sachat que %s est remplacer par 15 caratere

<fix><co><%s</co><lo>%s</lo><la>%s</la><al>%s</al><ti>%s</ti><ve>%s</ve><st>%s</st><in>%s</in></fix>

Donc je ne crois pas que la RAM suffira.

Maintenant ce que je n’ai pas préciser, j’ai une petite fonction qui control la RAM restant.
Par exemple. s’il retse 150o, il en envera 1 x le code ci-dessus
S’il reste 250, il envera deux fois le code ci-dessus. Mais l’envoi se fera une fois.
C’est la que j’ai besoin d’empiler ces deux set. avec un truc du genre strcat.

Ainsi la RAM restaera une “memoire tampon”. Pour l’envoi.

Aussi, je opeux en effet, réfléchir pour fractionner la chaine de caractere, mais si je la fractionne, j’aurai plus de connection au server pour l’envoi.
Par exemple, si je la fractionne, j’aurai deux envoi pour avoir le tout sur le serveur.

Vois-tu pourquoi? Quoi, peut etre que je me trompe encore :drooling_face: :slight_smile: