Liste(Tableau) de chaîne de caractère

Bonjour à tous,

Après avoir passé plusieurs heures à trouver la solution je me tourne vers vous pour comprendre et trouver une solution.

J’ai besoin de parcourir des tableaux contenant des chaines de caractères.
Ils sont déclarés en global de la manière suivante :

const int nbLigne1 = 1;
const int nbLigne2 = 2;
char * tabLigne1[nbLigne1];
char * tabLigne2[nbLigne2];

Plus loin dans mes méthodes, j’alimente mes tableaux de la manière suivante :

void afficherDateHeure()
{
	//if (now.minute() != currentDateTime.minute())
	{

		char bufDate[17];
		strncpy(bufDate, "DD/MM/YYYY hh:mm", 17);
		now.format(bufDate);

		tabLigne1[0] = bufDate;
	}
}

void afficherLevee()
{
	dht.read(8);


	char buffer[50] ;

	sprintf(buffer, "Levee: %02d:%02d ", eph->GetHrLeveeSoleil(), eph->GetMinLeveeSoleil());

	tabLigne2[0] = buffer;
	
}

Enfin, deux méthodes permettent d’exploiter ces tableaux (je ne met que la première la seconde étant sensiblement identique)

void AffichageEcranLigne1()
{
	char * val;
	int currentMilli = millis();
	if (currentMilli - lastMilliAffichage >= timeScreenValue)
	{


		// On traite la ligne 1
		if (currentLigne1 < nbLigne1 - 1)
		{
			currentLigne1++;
		}
		else
		{
			currentLigne1 = 0;
		}

		monEcran.setCursor(0, 0);
		monEcran.print("                ");

		monEcran.setCursor(0, 0);

		val = tabLigne1[currentLigne1];

		monEcran.print(val);
		Serial.println(val);
			   		 
		lastMilliAffichage = currentMilli;
	}

}

Ces deux méthodes sont appelées à la suite dans le Loop()

void loop()
{

	afficherDateHeure();
	afficherLevee();
	AffichageEcranLigne1();
}

J’en viens donc à mon soucis, lorsque j’utilise uniquement “afficherDateHeure();” les informations sont correctement affichées. Par contre lorsque j’utilise “afficherLevee();” en plus, le resultat de “afficherDateHeure” est supprimé.

Après avoir transféré une partie du code en application console pour faire du pas à pas, il semblerait que l’affectation de la valeur dans “tableau 2” écrase les valeurs de “tableau 1”.

Ais-je fait une erreur lors de mes déclarations ou autre ?

Merci pour votre aide :wink:

Normal, ton buffer est local :

	char buffer[50] ;

Soit tu le sors de la fonction afficherLevee, soit tu la rends static :

	static char buffer[50] ;

@+

Plutôt que de vous ennuyer avec des tableaux de pointeurs vers des zones static, utilisez directement des buffers globaux (en restant parcimonieux sur la mémoire)

const uint8_t nbLigne1 = 1;
const uint8_t nbLigne2 = 2;
const uint8_t maxDate = 17;
const uint8_t maxBufer = 50;
char tabLigne1[nbLigne1][maxDate]; // tableau à 1 entrée... bof
char tabLigne2[nbLigne2][maxBufer];
...
strcpy(tabLigne1[0], "DD/MM/YYYY hh:mm"); // tient juste dans maxDate caractères + caractère null
now.format(tabLigne1[0]);
...

Sinon un tableau d’une ligne ça ne sert pas à grand chose... autant avoir juste une variable...

const uint8_t maxDate = 17;
char laDate[maxDate]; 
...
strcpy(laDate, "DD/MM/YYYY hh:mm"); // tient juste dans maxDate caractères + caractère null
now.format(laDate);
...

Attention - ça part souvent d’une bonne intention - mais avec str[color=red]n[/color]cpy() et un nombre d’octets égal à la taille de la chaîne, la fonction ne vous met pas le ‘\0’ nécessaire pour une bonne cString (dans votre cas c’est OK, mais bon à savoir)

Super !
Merci à vous deux ça fonctionne parfaitement :slight_smile:

@J-M-L : J’ai mis un tableau car celui-ci aura contenir plusieurs valeurs, pour le moment une seule valeur me permet de faire des tests.