Pb compil entre 2 lignes similaires

je cherche la différence:

déclaration:
String Lig ;
char* LigneCmd[25];
int cpt_lig;

action:
Lig= "abc";
LigneCmd[cpt_lig] ="abc"; cas N°1 compil OK
LigneCmd[cpt_lig] = Lig; si je choisis le suivant Erreur compil pourtant Lig ="abc"

cannot convert 'String' to 'char*' in assignment

Bonjour @fnepk,
Pourquoi avoir créé votre sujet dans Le bar et pas dans la catégorie générale Français ? Par ailleurs, s'il vous plaît lorsque vous postez du code mettez le entre balise <CODE/>, cela permet une bien meilleure lisibilité.

➜ Lisez Les bonnes pratiques du Forum Francophone pour apprendre à bien utiliser le forum.

Merci d'avance,
Cordialement,
Pandaroux007

je l'ai déplacé

Votre problème vient du fait que vous tentez de placer un objet String dans un tableau de char. Pour passer le contenu de la string à LigneCmd, vous devez utiliser la méthode c_str() de la classe String, qui retourne une chaîne de caractères constante.

Le programme corrigé donne cela
String Lig;
char* LigneCmd[25];
int cpt_lig;

void setup()
{
  Serial.begin(115200);
  Serial.println("OK");

  Lig="abc";
  Serial.print("Lig: "); Serial.println(Lig);
  LigneCmd[cpt_lig] ="abc"; // ok car on passe directement une chaine de caractère
  Serial.print("LigneCmd: "); Serial.println(LigneCmd[cpt_lig]);

  // LigneCmd[cpt_lig] = Lig; // pas ok car Lig est un objet - une instance de la classe String
  /*
  variante ok, c_str() retourne une
  chaine de caractère constante
  voir https://www.arduino.cc/reference/fr/language/variables/data-types/string/functions/c_str/
  */
  LigneCmd[cpt_lig] = Lig.c_str();
  Serial.print("LigneCmd: "); Serial.println(LigneCmd[cpt_lig]);

}

void loop() {}

J'aurai bien fait un petit wokwi, malheureusement la fonction save demande maintenant de créer un compte...

PS : Merci @J-M-L :slight_smile:

String est un nom de classe, un type donc Lig est une instance de cette classe. Cette classe sert à représenter des chaînes de caractères.

char* est un type et avec la notation crochet, vous déclarez un tableau donc LigneCmd est un tableau de 25 pointeurs vers un caractère

➜ ça n'a rien à voir...

Il y a peut être confusion entre String et c-string

lire les docs

https://docs.arduino.cc/language-reference/en/variables/data-types/string/

et un petit tuto de base sur le C++ pourrait aider


@pandaroux007 attention

c'est un tableau de pointeurs, il faut écrire

char LigneCmd[25];

le compte est gratuit, ce n'est pas une grande demande au vu de l'utilité de la plateforme

Ouups effectivement mea culpa
➜ sur wokwi ça marchais donc je ne me suis pas posé de question :woozy_face:

@fnepk Ci-dessous le code corrigé :

String Lig;
char LigneCmd[25];

void setup()
{
  Serial.begin(115200);
  Serial.println("OK");

  Lig = "abc"; // ok car c'est un objet String, on peut lui affecter une valeur avec "="
  Serial.print("Lig: "); Serial.println(Lig);

  strcpy(LigneCmd, "foobar"); // ici comme c'est une c-string on doit utiliser les fonctions C
  Serial.print("LigneCmd: "); Serial.println(LigneCmd);

  // LigneCmd = Lig; // pas ok car Lig est un objet - une instance de la classe String
  /*
  variante ok, c_str() retourne une chaine de caractère constante
  voir https://www.arduino.cc/reference/fr/language/variables/data-types/string/functions/c_str/
  */
  strcpy(LigneCmd, Lig.c_str());
  Serial.print("LigneCmd: "); Serial.println(LigneCmd);

}

void loop() {}

Comme l'indique @J-M-L

il faut toujours faire attention avec les anciennes fonction C et il vaut mieux utiliser les versions avec n ou l qui permettent de donner la taille du buffer même si elles sont non standard (elles ont été adoptées quasiment partout maintenant).

➜ on préfèrera donc

strlcpy(LigneCmd, Lig.c_str(), sizeof LigneCmd);

et si vous voulez tester si ça a marché

if (strlcpy(LigneCmd, Lig.c_str(), sizeof LigneCmd) >= sizeof LigneCmd) {  
    // Gestion de l'erreur, la copie n'a pas réussi entièrement.  
} else {  
    // La copie a réussi.  
}

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