Concaténer des variables char *

Bonjour,

Je cherche à concaténer des variables char *.
Voici donc code simplifié:
A partir de la variable MOTOR, je voudrais créer 3 variables représentant le path de 3 fichiers sur une carte SD.

char *StartSound, *IdleSound, *StopSound;
char *MOTOR= "DIESEL";

void BuildEngineNames(const char *NewSound, bool lst)
{
  String path = "/ENGINES/";
  char *suffix1 = "_STA.wav";
  char *suffix2 = "_IDL.wav";
  char *suffix3 = "_STP.wav";
  String sta = path + NewSound + suffix1;
  String idl = path + NewSound + suffix2;
  String stp = path + NewSound + suffix3;
  StartSound = sta.c_str();
  IdleSound  = idl.c_str();
  StopSound  = stp.c_str();
  if (lst == true)
  {
    Serial.print("StartSound:");Serial.println(StartSound);
    Serial.print("IdleSound:");Serial.println(IdleSound);
    Serial.print("StopSound:");Serial.println(StopSound);
  }
}

void setup()
{
  BuildEngineNames(MOTOR , true);//1er print toujours OK

  delay(1000);
  Serial.print("StartSound:");Serial.println(StartSound);
  Serial.print("IdleSound:");Serial.println(IdleSound);// ce print retourne un mauvais caractèrer
  Serial.print("StopSound:");Serial.println(StopSound);
   delay(1000);
  Serial.print("StartSound:");Serial.println(StartSound);
  Serial.print("IdleSound:");Serial.println(IdleSound);// ce print retourne un mauvais caractèrer
  Serial.print("StopSound:");Serial.println(StopSound);
}
void loop()
{
}

Le résulat retourné sur la console:

StartSound:/ENGINES/DIESEL_STA.wav
IdleSound:/ENGINES/DIESEL_IDL.wav
StopSound:/ENGINES/DIESEL_STP.wav
StartSound:/ENGINES/DIESEL_STA.wav
IdleSound:�%
StopSound:/ENGINES/DIESEL_STP.wav
StartSound:/ENGINES/DIESEL_STA.wav
IdleSound:�%
StopSound:/ENGINES/DIESEL_STP.wav

Je ne vois pas où est mon erreur.
Je voudrais que mes trois variables StartSound, IdleSound et StopSound soient accessibles dans tous mon code, mais apparemment elles se perdent.

Merci pour votre aide,

Pierre

sta, idl et stp sont des String locales à BuildEngineNames() elles n'ont donc d'existance qu'à l'intérieur de BuildEngineNames()
.c_str() retourne un pointeur sur la chaîne de caractères utilisée par l'objet String. Donc lorsque tu fais StartSound = sta.c_str(); tu mets le pointeur qui pointe sur la chaine de sta dans StartSound. Lorsque BuildEngineNames() se termine, les variables locales sont libérées donc la mémoire peut être utilisée à autre chose et StartSound pointe sur n'importe quoi.
Le plus simple serait de mettre ces String en global au lieu de les déclarer dans BuildEngineNames.
L'autre solution serait de déclarer des tableaux de char plutôt que des pointeurs pour StartSound, IdleSound, StopSound de taille suffisante pour y copier le path complet et de les remplir avec des strcat() et/ou strcpy()

Vous confondez les "C-string" (char*) et "String" (class, chaînes typiques des langages de haut niveau). Vous devez utiliser soit le premier soit le deuxième, ils ne doivent pas être "mélangés" car ils ont des caractéristiques et des structures complètement différentes. De plus, si vous travaillez sur un UNO, les variables "String" sont obsolètes car leur gestion en mémoire peut entraîner de sérieux problèmes lors de l'exécution du code.
Dans votre code par exemple, « path » est une variable String, mais vous essayez de la concaténer avec NewSound qui est de type char*, mais comme une variable char* n'est en fait qu'un pointeur vers la mémoire, vous ne pouvez pas les concaténer.
Déclarez également les variables char *StartSound, *IdleSound, *StopSound; Ils définissent uniquement un pointeur, ils n'allouent aucune mémoire, sauf si vous spécifiez leur taille maximale (c'est-à-dire le nombre maximal de caractères qu'ils peuvent contenir, plus 1). Par exemple: char StartSound[10], IdleSound[10], StopSound;[10] De cette façon, vous allouerez 10 octets pour chacune de ces variables string (avec le "s" minuscule, nous entendons les "C-string") qui peuvent donc contenir des chaînes allant jusqu'à 9 caractères.

Vous devez maintenant décider si vous souhaitez continuer à utiliser des variables String (pas sur un UNO en tout cas) ou tout convertir pour utiliser C-string.

Si vous souhaitez continuer à utiliser ce "mix", vous pouvez convertir des C-string en String à l'aide de la fonction String(), par exemple :

  String sta = path + String(NewSound) + String(suffix1);
1 Like

On ne peut pas concaténer des String avec des c-string si on utilise +
On peut concaténer des String avec des c-string si on utilise .concat()

Bon sang, je n'avais pas vu ça.
Merci

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.