Tableau de structure, je fais quoi de faux?

J’essaie de faire un tableau de structure pour imprimer plus facilement les valeurs de mes booléens, mais je n’y arrive pas. Je n’arrive pas à trouver où est ce que je fait faut.

Mon code :

  bool vrai = true;
  bool faux = false;
  
  struct On_Off_txt {
    char offon[3];
    char nonoui[3];
    char nonc[2];
  };

  On_Off_txt OffOn[2] {
    {"Off","Non","NO"},
    {"On", "Oui","NC"},
  };


void setup() {
  Serial.begin(115200);
  delay(100);

  Serial.print("oui : "); Serial.print(OffOn[vrai].nonoui);
   Serial.print("\t\tnon : "); Serial.println(OffOn[faux].nonoui);
  Serial.print("On  : "); Serial.print(OffOn[vrai].offon);
   Serial.print("\t\toff : "); Serial.println(OffOn[faux].offon);
  Serial.print("nc  : "); Serial.print(OffOn[vrai].nonc);
   Serial.print("\t\tno  : "); Serial.println(OffOn[faux].nonc);
}

void loop() {  
}

Le résultat :

oui : OuiNC		non : NonNOOn
On  : On		off : OffNonNOOn
nc  : NC		no  : NOOn

Bonjour,

En C/C++ les chaines se terminent par 0.
Il faut donc réserver de la place pour ce 0.
donc

  struct On_Off_txt {
    char offon[4];
    char nonoui[4];
    char nonc[3];
  };

ça marche. :+1:
Merci beaucoup.

J’étais parti sur la numérotation des char[] qui commence à zéro. Donc un char[3] (0,1,2) pour 3 caractères, (3) pour un zéro d’arrêt. Mais apparemment, cela commence à 1 !

Non, ça commence effectivement à 0, mais il faut prévoir un caractère supplémentaire pour le 0 à la fin.

C'est justement là que je m'embrouille les pinceaux.
Il faut laisser la place pour deux caractères d'arrêt ?

char test[4] = "OFF";

void setup() {
  Serial.begin(115200);
  delay(50);
  for(int i = 0;i<=4;i++){
    Serial.print("test["); Serial.print(i); Serial.print("] :"); Serial.println(test[i]);
  }
}
void loop() {

}
/*
RESULTAT:
test[0] :O
test[1] :F
test[2] :F
test[3] :
test[4] :t
*/

Comme le dit @lesept les indices commencent à 0, mais quand tu fais char offon[4], tu as offon[0],offon[1],offon[2],offon[3] donc effectivement 4 éléments.

En général, on boucle comme ceci :
for (int i = 0; i < 4 ;i++)
Pour un tableau de dimension N, tu boucles avec le test < N
Si tu vas plus loin, tu continues à afficher ce qui se trouve plus loin dans la mémoire de ton micro, mais qui n'a rien à voir avec le contenu de ton tableau.

vu que les chaînes sont constantes, pour ne pas vous ennuyer avec les longueurs, mettez des pointeurs dans la structure...

bool vrai = true;
bool faux = false;

struct On_Off_txt {
  const char * offon;
  const char * nonoui;
  const char *  nonc;
};

On_Off_txt OffOn[] {
  {"Off", "Non", "NO"},
  {"On", "Oui", "NC et ça peut etre plus long on s'en fiche"},
};


void setup() {
  Serial.begin(115200);
  delay(100);

  Serial.print("oui : "); Serial.print(OffOn[vrai].nonoui);
  Serial.print("\t\tnon : "); Serial.println(OffOn[faux].nonoui);
  Serial.print("On  : "); Serial.print(OffOn[vrai].offon);
  Serial.print("\t\toff : "); Serial.println(OffOn[faux].offon);
  Serial.print("nc  : "); Serial.print(OffOn[vrai].nonc);
  Serial.print("\t\tno  : "); Serial.println(OffOn[faux].nonc);
}

void loop() {}

et bien sûr pour limiter l'usage de la RAM ce serait mieux de mettre tout cela en PROGMEM

PS: c'est pas bien d'utiliser un bool comme indice d'un tableau.. un enum serait mieux
au lieux de vos deux bool, faire
enum : byte {faux=0, vrai=1};

Cette fois j’y suis, si je met [4] c’est le nombre d’éléments (4 octets) .
Ce n’est pas comme je pensais , le numéro du dernier élément (5 octets).

C'est une bonne idée, mais je voulais comprendre ce qui clochai dans mon code.

Un bool c'est un 0 ou un 1, pourquoi ne pas l'utiliser comme indice ?
Dans mon programme (pas dans le petit code ci-dessus), ils représentent l'état des leds, des capteurs, des inverseurs (normalement fermé ou ouvert), ...

j'ai fait ça pour simplifier l'impression de rapports, au-lieux de faire un if...else... pour chaque booléen, je fais
Serial.print(F("Capteur1 est à ")); Serial.println(OffOn[capt1].offon);
Je ne vois pas comment utiliser "enum" pour imprimer "On" ou "Off" selon l'état de chaque bool !

Merci beaucoup pour tous ses renseignements.
Bonne journée à vous.

non, pas en C++ - c'est un type à part entière (valeur de vérité) qui effectivement se promeut pour des raisons historiques en 0 et 1 quand il est utilisé à la place d'une valeur numérique mais ce n'est pas une bonne raison pour "tordre" la conformité des types.

un enum est plus adapté (ou des constantes voire un #define)

vous typez votre enum et utilisez ce type pour votre variable d'état

enum typeEtat : byte {faux=0, vrai=1};

typeEtat variable1 = faux, variable2 = vrai;

Tu peux utiliser l'opérateur ternaire, c'est 3 caractères de plus :

OffOn[capt1?1:0].offon

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