Comment optimiser mon code en utilisant une variable à la place de deux

Bonjour à tous,

J'utilise due xvariable pour vusionner des valeurs. Soit

char lon[15]; // qui vaut 45.56543234444\0 (14+1)

et

char xmlLon[24]; //<lo>45.56543234444</lo>\0

Afin que la valeur de lon soit au fomat XML, j'utilise cette fonction

sprintf(xmlLon,"<lo>%s</lo>",lon);

Ce qui m'enbete c'est que j'utilise 30o de ma mémoire et j'ai bien entendu plusieur cas comme celui-ci.
Alors dans le but d'otimiser ma mémoire comment pourrais-je faire pour utiliser une variable et supprimer la varibale xmlLon, de maniere a ce que lon prenner la valeur de "45.56543234444\0"???

Merci

Tu as parfaitement le droit d'écrire

sprintf(lon,"<lo>%s</lo>",lon);

maintenant il y a quand même un problème dans ton code
Dans cette partie tu dis que ta chaîne fait 15 caractères

char lon[15]; // qui vaut 45.56543234444\0 (14+le0)

et tu lui ajoutes 9 caractères ( et ) donc ta chaîne devrait faire 15 + 9 = 24 caractères.
Et toi tu la stockes dans:

char xmlLon[15]

C'est pô bien.....
Donc il vaudrait mieux faire

char xmlLon[24]

Ce qui m'enbete c'est que j'utilise 30o de ma mémoire et j'ai bien entendu plusieur cas comme celui-ci.

Si tu as plusieurs cas comme ça tu peux aussi créer une variable tampon que tu utiliseras pour toutes les conversions

char tampon[25];

sprintf(tampon,"<lo>%s</lo>",lon);
// là tu utilises tampon comme tu veux

sprintf(tampon,"<la>%s</la>",lat);
// là tu utilises tampon comme tu veux

// et ainsi de suite

Et toi tu la stockes dans:
Code:

char xmlLon[15]

Oui c'est juste, j'ai corrigé mon post après que tu aies répondu

Tu as parfaitement le droit d'écrire
Code:

sprintf(lon,"%s",lon);

Donc ca écrase la valeur précédente?
Je me sens tellement bete par rapport à ca. J'avais une fois essayé, mais ca m'avait généré une erreur, et depuis j'ai fait comme. Ou j'ai du confondre, Bref......

Merci

Bonjour,

Si le but c'est réellement d'optimiser pourquoi utiliser des char pour stocker un flottant (alors que float est là pour ça) ?
Comment tu utilises ton morceau de xml par la suite ?

Si le but c'est réellement d'optimiser pourquoi utiliser des char pour stocker un flottant (alors que float est là pour ça) ?

Oui en effet, je vais me concentrer la dessus, pour remplacer les char par des float. (Ma fonction retourne de char).

Toujours dans le but d'optimiser mon code, j'ai eu une reflexion hier soir et je me demande si je devrai pas corriger deux trois trucs.

Je vais donner une exemple de code

#include <MemoryFree.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include "gps.h" // RAM : 1170 -> 1039
#include "inetGSM.h" // RAM : 891, then 881 when adding serialhwread()
#include <EEPROM.h>

char lon[50];
char lat[50];
char gsm[100];
char dir[50];
char numero[50];

void setup(){}
void loop(){
  // Ici il y a  un timer pour que GetGPS() soit appeler tous les 2mn (je ne l'écris pas, pour faire plus simple)
  GetGPS();
   // Il n'y a pas de timer
  GetGSM();
  // Ici il y a  un timer pour que GetSMS() soit appeler tous les 5mn (je ne l'écris pas, pour faire plus simple)
  GetSMSToCinqMn();
}
void GetGPS(){
  // Fait quelque chose avec les variables lon et lat
}
void GetGSM(){
  // Fait quelque chose avec la variable gsm
   GetDIR();
}
void GetDIR(){
  // Fait quelque chose avec la variable dir
}
void GetSMSToCinqMn(){
  // Fait quelque chose avec la variable numero
}

Dans mon banal exemple, on est d'accord que mon microprocesseur va utiliser 300o de RAM, tout le temps, jusqu'a ce que j'éteigne mon microprocesseur.
Simplement pendant 4mn, il y a 50o qui auccupe la ram pour rien, mais a l a5eme minute la fonction GetSMSToCinqMn() va utiliser 50o.

Je me disais que si je placais les 4 char dans leurs fonction, ca permettrait d'utiliser la mémoire que lorsque le Micropro en a besoin, puis que lorsque l'on quitte une fonction , la mémoire utilisée par un char , est libirée .

Suis-je bien juste?
Donc je me demandais si c'était une bonne idée de modifier ainsi, sachant que les fonctions ne vont jamais etre appelée en meme temps, mais l'une après l'autre, séquencée par un timer.

#include <MemoryFree.h>
#include "SIM900.h"
#include <SoftwareSerial.h>
#include <Wire.h>
#include "gps.h" // RAM : 1170 -> 1039
#include "inetGSM.h" // RAM : 891, then 881 when adding serialhwread()
#include <EEPROM.h>


void setup(){}
void loop(){
  GetGPS();
  GetGSM();
  // Ici il y a  un timer pour que GetSMS() soit appeler tous les 5mn (je ne l'écris pas, pour faire plus simple)
  GetSMSToCinqMn();
}
void GetGPS(){
   char lon[50];
   char lat[50];
   inet.getGps(lon,lat); // fonction d'une librairie, racourcie qui va exécuter la command AT pour avoir les positions gps
  // Fait quelque chose avec la variable lon, lat
    Serial.println(lon);
    Serial.println(lat);
}
void GetGSM(){
  // Fait quelque chose avec la variable gsm
    char gsm[100] ="100_caracteres_pour_l_exemple......."
   GetDIR(gsm);
}
float GetDIR(int pos){
   char dir[50];
   float numero;
  // Question le dir pour afficher ce qui le nuemro la la position pos
  return numero;
}
void GetSMSToCinqMn(int pos, String text){
  // Fait quelque chose avec la variable pos en envoi un sms en utilisant le numero a la position pos du directory
   float numero;
  strcpy(numero,GetDir(pos);); //OK il y a pas 50 caractere, mai faisons comme..
   //fonction tiré de ma librairie
   inet.sendSMS(numero,text);
}

Dans cette exemple, on est d'accord que la mémoire de mon microcontroller sera utilisée que lorsque les fonctions sont appelées.

Donc quand la fonction GetSMS sera appelé, les 100o utlisé par GetGPS seront libérés?

Voilà, on est d'accord que ce code ne marchera pas comme ca, mais c'est plus pour faire part d'une autre maniere de placer mes variable qui consome de la mémoire.

Voyez-vous ce que j'essaye de dire, malgré ces exemples de code non fonctionnels :slight_smile: ?

Règle de base d'optimisation n°1 : Les variables doivent être déclarées dans le scope (= fonction/bloc) où elles sont réellement utilisées.
Dans ton cas les char[50] n'ont rien à faire en variable globales tu est dans le bon :wink: