Dificultée avec boucle et tableau

Bonjour,
dans le rogramme de gestion de ma VMC, à chaque changement d’etat de fonctionnement j’alimente une string pour l’afficher ces etats sur ma page Html.
Dans un premier temps je déclare un tableau et une string:
int IndexMiseEnRoute[5]={11,11,11,11,11};
CauseMiseEnRoute = “”;

A chaque étape franchit j’alimente comme ceci mon tableau
etape 0:
IndexMiseEnRoute[0] = 2 ;
etape 1:
IndexMiseEnRoute[1] = 2 ; // ou 3 ou 4
etape 2:
IndexMiseEnRoute[2] = 6 ;
etc …

Arrivé à la fin de la routine, j’alimente mon string comme ceci:

                       char* ListMiseEnRoute[12]={"V-S Off - ","V-S Hiver - ","V-S ete - ","Douche - ","Non utilisé - ","T comble - ","T exterieure - ","T sortie OK - ","Seche linge - ","Vit2 Douche ou S_Linge - ","Vit2 entree calorie - "," "};

                            for(int i=0; i < 4 ; i++)
                            {
                                CauseMiseEnRoute +=  ListMiseEnRoute[IndexMiseEnRoute[i]];
                            }

Le probleme est que ça ne fonctionne pas , au bout d’un certain temps ça me plante le serveur et je n’arrive pas à comprendre pourquoi.
J’ai tenté plusieurs variantes mais ça plante toujours.
Le fait de supprimer cette boucle et mettre simplement

CauseMiseEnRoute = "On";

je n’ai plus de plantage.

Merci de votre aide,

CauseMiseEnRoute est un tableau de taille non définie.
Tu dois gentiment déborder dans la RAM de l’arduino.
Il faut réserver une taille pour ce buffer. Le mieux serait de créer une variable locale (afin de ne pas occuper de la place en mémoire en permanence) et s’assurer que la taille déclarée permettra de stocker la chaîne la plus longue que tu auras à mémoriser.

Bonjour, merci pour la réponse rapide, je ne te suis pas là, CauseMiseEnRoute est une string et non un tableau, il est vrai que dans mon premier post ça peut préter à confusion.

bonjour,
normal je dirais, sauf erreur de ma part.
tu ajoute à chaque boucle la même “phrase”, si bien qu’à la fin, ca te donne un truc de ce style

  "V-S Off - ;,"V-S Hiver - ","V-S ete - ","Douche - ","Non utilisé - ","T comble - ","T exterieure - ","T sortie OK - ","Seche linge - ","Vit2 Douche ou S_Linge - ","Vit2 entree calorie - ","V-S Off - ;,"V-S Hiver - ","V-S ete - ","Douche - ","Non utilisé - ","T comble - ","T exterieure - ","T sortie OK - ","Seche linge - ","Vit2 Douche ou S_Linge - ","Vit2 entree calorie - ","V-S Off - ;,"V-S Hiver - ","V-S ete - ","Douche - ","Non utilisé - ","T comble - ","T exterieure - ","T sortie OK - ","Seche linge - ","Vit2 Douche ou S_Linge - ","Vit2 entree calorie - ","V-S Off - ;,"V-S Hiver - ","V-S ete - ","Douche - ","Non utilisé - ","T comble - ","T exterieure - ","T sortie OK - ","Seche linge - ","Vit2 Douche ou S_Linge - ","Vit2 entree calorie - ",};

Oui, il faut peut-être penser de temps en temps à vider CauseMiseEnRoute...

Euh oui mais c’est déja le cas ,
je voulais éditer mon 1er post pour corriger mais vous avez répondu plus rapidement que prévu. :drooling_face:
En fait à chaque fois en tout début de la fonction je vide tout de cette façon:

       for(int i =0; i< 4; i++)
     { IndexMiseEnRoute[i]=11;}
      CauseMiseEnRoute = "";

Désolé!..

lolo81:
Bonjour,
merci pour la réponse rapide,
je ne te suis pas là, CauseMiseEnRoute est une string et non un tableau,
il est vrai que dans mon premier post ça peut préter à confusion.

Elle est définit comment cette variable? On ne voit que des bouts de code

Voila le code de ma fonction:

String CauseMiseEnRoute = "";
int IndexMiseEnRoute[5]={11,11,11,11,11};
void GestionVMC ()
{ 
  if ((Auto) && (NdemarrageVMC <= 3)) 
  {
    //------------------------Remise à zero
      for(int i =0; i< 4; i++)
     { IndexMiseEnRoute[i]=11;}
      CauseMiseEnRoute = ""; 
//--la gestion des sondes avec le pilotage des sorties de l'arduino 
//   ainsi que le remplisage du tableau 
etape 0:
IndexMiseEnRoute[0] = 2 ;
etape 1:
IndexMiseEnRoute[1] = 2 ; // ou 3 ou 4
etape 2:
IndexMiseEnRoute[2] = 6 ;
etc ...
}//fin declenchement horaire ou hygro de la SDB
    else
    {
                Vmc_On = false;
    }
if(Vmc_On)//La gestion fait qu'il faut allumer la VMC
                      {
                       char* ListMiseEnRoute[12]={"V-S Off - ","V-S Hiver - ","V-S ete - ","Douche - ","Non utilisé - ","T comble - ","T exterieure - ","T sortie OK - ","Seche linge - ","Vit2 Douche ou S_Linge - ","Vit2 entree calorie - "," "};

                            for(int i=0; i < 4 ; i++)
                            {
                                CauseMiseEnRoute +=  ListMiseEnRoute[IndexMiseEnRoute[i]];
                            }
                     }

ca change rien du tout, ca t'indente CauseMiseEnRoute en rajoutant i il te manque quelque chose dans ton code. essaye de donner le résultat final que tu dois avoir et mettre ton code en entier.

@infobarquee non il y a ça:

      CauseMiseEnRoute = "";

en entrée de gestionVMC()

OK on y voit plus clair. Faudrait voir à ne pas mélanger string et String ce n'est pas la même chose et après on ne comprend plus rien aux explications.

Le problème de la classe String c'est qu'elle fait de l'allocation dynamique de mémoire. Donc il peut y avoir une saturation de la RAM. Il faut aussi penser à tester si a chaîne est valide. Lorsqu'une opération échoue à allouer de la mémoire pour agrandir le buffer de chaîne alors la chaîne devient invalide (un test sur la chaîne retourne false).

Bon là je vous suis carement pas, mon code fonctionne tres bien mais pas longtemps, je pense que fdufnews a raison mais comment y remedier? En faisant par exemple:

CauseMiseEnRoute = "Off";

Au lieu de

CauseMiseEnRoute = "";

Pour mieux gerer la mémoire? Comment tester si la chaine est OK?

if(CauseMiseEnRoute) {......}

lolo81: Bon là je vous suis carement pas, mon code fonctionne tres bien mais pas longtemps, je pense que fdufnews a raison mais comment y remedier?

Remplacer les String par des string. La gestion est plus pénible puisqu'il faut tout faire sois-même mais au moins tu maîtrises un peu mieux l'utilisation de la mémoire. Il faudra utiliser les strcpy, strcat, .... Ensuite: sois tu crées des variables locales en allouant juste la bonne taille à chaque fois dans les fonctions sois, si tu manipules pas mal de chaînes dans tout ton programme, tu crées un buffer en variable globale qui sera partagé par les différentes fonctions

En clair c’est pas gangné !!
Va faloir potasser le c++!!
Merci quand même…

lolo81: En clair c'est pas gangné !! Va faloir potasser le c++!! Merci quand même..

Non au contraire les string (enfin les tableaux de char) et les strcpy, strcat, et toute la famille des strxxx c'est du bon vieux C à papa.