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.
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.
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);