comparer deux string (chaîne de caractères)

Portrait de Toinoobz

Bonjour, je n'arrive pas a faire fonctionner ma comparaison de String.

voici le code avec juste une comparaison de char:

char carlu;

boolean depart;

boolean fin;

boolean indice;

void setup{

depart = false;

fin = false;

indice = false;

}

void lecture() {

  Serial.println(carlu);

  // si la donnée est "s"
  if (carlu == 's') {
    depart = true;
      Serial.println("là");
  }if (carlu == 'p') {
    fin = true;
      Serial.println("ici");
  }if (carlu == 'h') {
    indice = true;
      Serial.println("ouf");
  }

  
}

void loop() {

  if (Serial.available() > 0) {       // on lit la données reçue (dans la variable "donnee")
    carlu = Serial.read();
    lecture();
  }
}

J'aimerais pouvoir comparé des "char array" des mots plutôt que des lettres

Portrait de Manoé

Je pense que le code qui suit est un peu plus clair :

char CarLu;
String MaChaine;
void setup() {
  Serial.begin(9600);
}
void loop() {
  MaChaine = "";
  while (Serial.available() > 0) {
    delay(10);
    CarLu = Serial.read();
    if (CarLu > 32) // pour ne pas ajouter de caractère de contrôle comme Retour Chariot , Nouvelle ligne ETC... !
      MaChaine += CarLu;
  }
  if (MaChaine > "") {

    if (MaChaine == "start")
      Serial.println("Vous avez écrit start");
    else if (MaChaine == "fin")
      Serial.println("Vous avez écrit fin");
    else if (MaChaine == "aide")
      Serial.println("Vous avez écrit aide");
    else
      Serial.println("chaine inconnue");
  }
}

Portrait de Toinoobz

Super, merci.

Je vais faire une explication à ma façon pour ceux que ça pourrait intéresser.

char CarLu;
String MaChaine;
void setup() {
  Serial.begin(9600);
}
void loop()

{
  MaChaine = "";
  while (Serial.available() > 0)  //lire tant qu'une info est disponible sur le buffer du port serie

{
    delay(10); // indispensable! Je ne sais pas comment la valeur est définit mais ça fonctionne
    CarLu = Serial.read(); //met la valeur sur le port serie dans CarLu
    if (CarLu > 32) // pour ne pas ajouter des caractère de contrôle !
      MaChaine += CarLu; //ajoute le caractére CarLu a la suite dans MaChaine
 }
  if (MaChaine > "") { //si MaChaine est différante de "vide" (le signe ne devrais pas etre >> ou  !=  ?)

    if (MaChaine == "start")   //attention il n'y a pas de {} car la condition ne comporte qu'une ligne, si vous mettez plusieurs ligne il faudra ajouter les {} 
      Serial.println("Vous avez écrit start");// statements
    else if (MaChaine == "fin")
      Serial.println("Vous avez écrit fin");// statements
    else if (MaChaine == "aide")
      Serial.println("Vous avez écrit aide");// statements
    else
      Serial.println("chaine inconnue");  // dans tous les autres cas de figure
  }
}

Portrait de Manoé

if (MaChaine > "") { //si MaChaine est différante de "vide" (le signe ne devrais pas etre >> ou  !=  ?)

Tu pourrais utiliser "!=" mais pas ">>" car ce dernier 'code' signifie rotation de bit à droite, dans une comparaison on double le "==" pour ne pas le confondre avec "=" qui lui est une attribution d'une valeur à une variable !

Portrait de Walter

L'opérateur > en C++ permet de savoir si la chaînes de gauche se trouve lexicalement après la chaînes de droite, soit baud > bad > add.
 

en général si tu as 3 if qui sont dépendant les uns des autres et exclusif, le mieux est d'utiliser des if else.
car comme ça tu n'execute pas des instructions inutile, car dans le pire des cas, tu fais évalué les 3 comparaisons alors que seulement la première aurait été nécessaire.

Quel est le problème avec ton programme ?

Portrait de Manoé

Walter si tu avais lu mon post tu aurais compris que le problème était résolu et même avec des "else if"  !!!

Je ne vois pas ce que "baud > bad > add." vient faire ici ! Mais j'aimerai bien que tu expliques ce que tu entends par " lexicalement "... Je pense que alphabétiquement serait plus approprié dans ce cas précis.

Pour ta gouverne le problème venait du fait que la comparaison se faisait avec la chaîne incrémentée des caractères de contrôle du type 'Line Feed' et "Cariage Return" que le moniteur série peut ajouter ou non à l'envoi en fonction de l'options choisie.

Portrait de Walter

J'ai très bien lu ton post, par contre j'ai un doute sur le fait que tu en as fait de même avec le mien!
A quel moment ais je évoqué le fait qu'un 'if else' résolvait son problème?

Tu as raison, le bon terme doit être ordre lexicographique :), ce n'est pas vraiment un ordre alphabétique, l'espace ne faisant pas partie de l'alphabet, ainsi que les caractères graphique de ponctuation, je crois que c'est uniquement la valeur ascii du caractère graphique qui est utiliser dans la comparaison.
Un petit lien vers wikipédia, qui sera sûrement bien mieux expliquer que moi ce que je voulais dire :)

Ha ok, mais en quoi cela pause problème, son programme devrait ne rien afficher avec tout autre caractère que sph(en minuscule)?

Portrait de Toinoobz

Merci Messieurs de toutes ces informations, Seul Manoé a eu le code initial avec tous ses défauts, mon problème était bien dans les filtres des caractères comparé. J'ai refait un code plus simple et plus lisible pour partager sur le forum.   Mon problème est donc résolu! Merci "les-electroniciens"

Portrait de Manoé

Pour Walter

Juste là :

en général si tu as 3 if qui sont dépendant les uns des autres et exclusif, le mieux est d'utiliser des if else.

Mais juste un truc c'est else if !! Pas if else mais bon ...

Merci pour le cours de français mais avec l'orthographe que tu as cela fait un peu pompeux.

Portrait de Jetfuzz

Manoé, SPY , Brossden, enfin l'homme qui a plus de pseudo sur ce forum que de couilles .
Arrête de de vouloir jouer a qui a la plus grosse en permanence, c'est saoulant a la fin.
Franchement ferme la.

Jetfuzz

Portrait de Walter

Je veux bien être gentil Manoé, mais c'est toi qui me donne des cours de français, de compréhension et qui essaye de me clasher, alors que tu n'a même pas pris le temps d'essayer de comprendre ce que j'ai écrit.

Donc je te le répète en quoi la phrase que tu as cité, exprime comment résoudre le bug!!!!!!
Franchement a pars d'être d'une mauvaise fois sans borne, je ne comprend pas, comment tu peut interpréter la phrase ci-dessous, comme la correction au problème de Toinoobz, problème que je ne connais pas d'ailleurs

en général si tu as 3 if qui sont dépendant les uns des autres et exclusif, le mieux est d'utiliser des if else.
car comme ça tu n'execute pas des instructions inutile, car dans le pire des cas, tu fais évalué les 3 comparaisons alors que seulement la première aurait été nécessaire.

Donc je le répète aussi, en général il est préférable (soit une bonne pratique, de l'optimisation) de ne pas utiliser 3 if exclusif, mais plutôt de les chaîner, car cela évite(perde du temps CPU) d'évaluer 3 conditions alors, que la première aurait pu suffire.

Oui c'est bien "if else", "​if (condition) instruction1 else instruction2", instruction2 pouvant lui même être une structure de contrôle "if else".

Par contre je te rassure de suite, ça me dérange pas si tu as la plus grosse, moi tant que j'arrive à m'amuser avec le mienne ca me suffit ;)
Par contre si tu pouvais t'abstenir de gâcher mon plaisir avec des conneries, ca m'arrangerais merci.
 

Portrait de Manoé

Walter et Jetfuzz vous êtes des super programmeurs, je m'incline !

Portrait de Walter

Quel est le rapport!!!

je ne sais pas quelle sont tes relations avec SPY, mais comme on lui as déjà dis, on n'a rien à prouver et il ne s'agit absolument pas de savoir si on est meilleurs électroniciens ou programmeur que toi.

Simplement qu'avant de vanner et de prendre les gens de hauts, peut être pourrait tu au moins lire et essayer de comprendre ce que les gens ont voulu dire.

C'est dommage que tu n'es pas l'honnêteté d'admettre que tu t'es planté, ca nous arrive à tous quelques soit notre niveau, c'est pas bien grave.

Bisous.

Portrait de Manoé

Vous voulez que je me sois planté ok je reconnais que je me suis planté je ne sais pas vraiment où mais je reconnais tout ce que vous voulez !

Vous avez raison sur toute la ligne !

Juste un petit truc pourtant Walter pourquoi tu ramènes ta fraise sur un sujet qui avait trouvé sa solution et tu viens donner des cours à qui ne t'as rien demandé ??? Enfin je m'excuse encore d'avoir fait cette remarque qui n'a somme toute aucun intérêt.

Il faut m'excuser car je ne suis qu'un simple installateur de porte rapide !

Portrait de Jetfuzz

Juste un petit truc pourtant Walter pourquoi tu ramènes ta fraise sur un sujet qui avait trouvé sa solution et tu viens donner des cours à qui ne t'as rien demandé ???

Mais je rêve la !!!!!

Hé, on est sur un forum, PAS TON FORUM, alors s'il te plait, comme déjà expliqué a ton géniteur, Ici ce n'est pas une autocratie.
Donc ce genre de reflexion tu te les gardes bien au fond de ton ......

Cordialement

Jetfuzz
 

Portrait de Walter

Ok, tu as rien compris à ce que je t'ai dis, en fait.

Je ramène ma fraise parce Toinoobz pose une question sur l'opérateur > et que ta réponse ne lui explique pas pourquoi cet opérateur, peut être utilisé dans ce cas!
J'ai du mal à voir ce qu'il y a de mal.

J'en profite pour lui donner un conseil de développement, car à priori c'est un "débutant" en programmation et autant prendre rapidement de bonne pratique.
Après il en fait ce qu'il en veut.

Pourquoi veux tu t'excuser d'avoir une profession, quel est le rapport avec notre sujet?
Je ne comprend pas pourquoi tu pars sur tes grand chevaux et t'énerve ainsi, comme tu le dis cela a somme toute peu d'importance.

Portrait de Manoé

Walter tu as bien dit :

en général si tu as 3 if qui sont dépendant les uns des autres et exclusif, le mieux est d'utiliser des if else.
car comme ça tu n'execute pas des instructions inutile, car dans le pire des cas, tu fais évalué les 3 comparaisons alors que seulement la première aurait été nécessaire.

Puisque je ne comprend rien à rien, j'aimerai que tu nous donnes un exemple de ce que tu dis juste au dessus.

Avec 3 "if" et 3 "else" qui évitent au processeur d'exécuter des instructions inutiles par ce que franchement je ne vois pas comment fonctionne ton raisonnement.

Donc s'il te plait fait nous une comparaison par exemple de la variable MaChaine avec les termes "debut", "milieu" et "fin" ces trois mots étant pris au hasard !

Je ne vois pas comment tu organises ton code alors s'il te plait donne moi la solution avec ton système.

Portrait de Jetfuzz

Walter.
Exactement.
(manoé,spy, brosdeen) te crache un code, c'est moi qui l'ai fait, tu prends ca marche.
Moi comme déjà évoqué ne demande qu'a comprendre, et effectivement les string c'est compliqué, sans jeu de mot.
Donc oui son code fonctionne, mais pourquoi !!!!!
et Walter arrive avec les explications du pourquoi et du comment, et la , tu te dit "mais oui , j'ai compris le truc"
ET donc "MERCI", pas la peine de faire un long discours. On veux juste comprendre point barre.
Jetfuzz

pour finir

je ne sais pas quelle sont tes relations avec SPY

Je récapitule, au commencement, il y avait Brossden, qui a engendré SPY, qui lui même a engendré Manoé. qui bientôt va disparaître pour engendrer ..........
"To be continued"

Portrait de Walter

;) Jetfuzz

Manoé il n'y a pas d'organisation de code ou quelque chose de spécial ou extraordinnaire.

Si tu as le code suivant :
monCar =  lecture();

if (monCar == 'd') {
...
}
if (monCar == 'm') {
...
}
if (monCar == 'f') {
...
}

Donc un seul des 'if' va matcher la condition
Normalement cela s'écrit plutôt ainsi:
if (monCar == 'd') {
...
} else if (monCar == 'm') {
...
} else if (monCar == 'f') {
...
} else {

}

Voir si comme là tu as un nombre avec un switch

switch(monCar) {
    case 'd' :
        ...
        break;
    case 'm' :
        ...
        break;
    case 'f' :
        ...
        break;
    default:
        ...
}

si monCar vaut par exemple 'd', alors les conditions "monCar == 'm'" et "monCar == 'f'", ne seront pas évaluées.
Ici cela a que peut d'impacte 1 comparaison au lieu de 3, l'optimisation est infime, mais si au lieu d'une simple comparaison tu avait un appel de fonction du genre analyseDechaine(maChaine), avec par exemple isPalindrom(maChaine), isReverse(maChaine), nbSyllable(maChaine), il est inutile d'appeler du code qui ne sert pas.
Un "return" dans chaque block des "if" peut aussi très bien faire l'affaire suivant les cas.

C'est simplement des bonnes pratiques, cela optimise ton code, le rend plus visible, après cela ne te résolve pas un bug en soit.
Si Toinoobz suit mon conseil, c'est bien (enfin je pense :) ), mais cela sera bien moins important que de résoudre son bug comme tu l'a fait.
Après il n'a pas donné son code initial bugué, mais un code d'exemple vite fait a priori sans réel bug!!!
 

Portrait de Manoé

Walter tu es génial comme à ton d'habitude tu esquives magistralement, déjà tu compares des chars alors que le sujet est la comparaison de chaînes !

Mais où sont les 3"if" et 3 "else" dont tu nous faisait le cours ??

" en général si tu as 3 if qui sont dépendant les uns des autres et exclusif, le mieux est d'utiliser des if else. "

Tu ne gagnes absolument rien dans ton premier exemple tu passes par tous les tests le dernier ne fonctionne pas avec des chaîne donc j'attends toujours l'exemple de ou tu gagnes des tests .

Par contre tu utilises bien les "else if" comme moi dans les deuxième exemple ! Ce qui n'apporte rien !

Donc en gros je te prends pour une bugne, Jetfuss qui te défend corps et âme, ne vaut pas mieux, je suis désolé mais c'est une réalité difficile à défendre !

Si j'étais méchant je dirais que tu as fait un post pour ne rien apporter, mais je m'en garderais bien.

Portrait de Jetfuzz

Si j'étais méchant je dirais que tu as fait un post pour ne rien apporter, mais je m'en garderais bien.

C'est bien ce que tu es entrain de faire, comme a ton habitude, polluer les post pour prouver que tu as raison.
et une fois que tu a bien foutu le souk, tu supprimes tout tes post, pour rendre le forum encore plus incompréhensible.
et tout ca en bafouant toutes les règles du forum....
ca vous rappelle rien !!!

Ecoutez, vous êtes si bien entre vous que je vous laisse vous débrouiller moi je ne suis pas comme vos je n'ai pas l'âme de soeur Thérèse quand je trouve que quelqu'un me casse les couilles en ne voulant absolument pas écouter ce qu'on lui dit et que pense au bout du compte que c'est un CON et bien je le lui dit. Bonne chance à tous pour patoger dans cette population. Je reste sur se site sans intervenir uniquement pour rigoler en compagnie de mon père Brossden, des âneries qui ne manqueront pas d'être postées ici. Vous aurez pu remarquer quand même que je n'ai jamais de demandé ici aucune assistance !

Alors Salut la Compagnie !

PS dédié au con où est quand ai-je menti CONNARD !

cordialement JetfuZZ

Portrait de Walter

+1

Portrait de Walter

C'est quoi une "bugne"?

if (monCar == 'd') {
...
} else if (monCar == 'm') {
...
} else if (monCar == 'f') {
...
} else {

}

Il y a combien de if et combien de else ?
Ou tu vois que l'on passe par tout les tests?
Oui j'utilise bien des "if else" dans les instructions du else précédent, comme toi, puisque c'est que je dis depuis le début!!!
Dis moi tu fais exprès de ne pas comprendre ?

 

Donc en gros je te prends pour une bugne, Jetfuss qui te défend corps et ême ne vaut pas mieux, je suis désolé mais c'est une réalité dont je vois mal comment vos pourriez vous défendre !

 Ha on retrouve les mêmes arguments que SPY, si tu le connais ou tu as un moyen de communiquer avec lui, je crois que j'avais réussis après mainte échange à lui faire admettre que je savais de quoi je parlais.
Pour reprendre ton langage, je suis aussi désolé, mais c'est une réalité tu fais exprès pour foutre la merde de ne pas comprendre.
Pour preuve à priori tu n'es pas un débutant et tu continue, a faire semblant de mal interpréter mes propos sur un truc ultra basique, qui ne mérite pas tant de blabla.
 

Pour faire comme toi, de la provoque et le nigaud de service, si tu pense qu'il est plus intéressant de faire 3 if sans else, c'est une réalité tu es un "bugne"
Dis moi tu développe en Windev non ?

Portrait de Manoé

Là Walter tu me prends vraiment pour un con !

Qui a écrit cela :" Oui c'est bien "if else", "​if (condition) instruction1 else instruction2", instruction2 pouvant lui même être une structure de contrôle "if else". "

Tu es incroyable et tu as l'audace de dire que je devrais m'excuser je comprends Spy à ton égard tu ne vaux pas grand chose même pas le courage d'admettre que tu as tort !

Et tu continues avec tes if else qui n'éxiste pas !

" Oui j'utilise bien des "if else" dans les instructions du else précédent, comme toi, puisque c'est que je dis depuis le début !!! "

Être de mauvaise foi à ce point c'est vraiment déplorable le nez dans la merde tu dis encore que cela sent bon !

Portrait de Walter

Tu es rigolo toi,

en général si tu as 3 if qui sont dépendant les uns des autres et exclusif, le mieux est d'utiliser des if else.

Mais juste un truc c'est else if !! Pas if else mais bon ...

D'ou ce que tu cite:

Qui a écrit cela :" Oui c'est bien "if else", "​if (conditioninstruction1 else instruction2", instruction2 pouvant lui même être une structure de contrôle "if else". "

 

Tu es incroyable et tu as l'audace de dire que je devrais m'excuser je comprends Spy à ton égard tu ne vaux pas grand chose même pas le courage d'admettre que tu as tort !

Ca me fais plaisir que tu me trouve incroyable, surtout que je ne t'ai jamais demandé de t'execuser!!!

Lit tu vraiment les posts des autres?
A priori tu n'a pas compris ce que j'ai voulut dire dans mon premier post et tu utilise cette mauvaise compréhension pour essayer de me vanner, ca t'étonne que j'essaye de me défendre ?

Je veux bien avoir tort, mais peu tu seulement exprimer en quoi jai tort???

Portrait de Manoé

Incurable !

Relis toi et tu verras que je n'invente rien !

Portrait de Walter

Encore une réponse dans le vide à la SPY, en fait tu es pris à ton propre jeu et tu ne sais pas me répondre?
Je ne vois au contraire qu'une invention, je suis obligé que tu me fasse voir les choses en faces!

Portrait de Manoé

Jetfuzz quel post ai-je supprimés ?

Vous prenez tous les deux les gens pour ce qu'ils ne sont pas, je n'ai absolument rien supprimé.

Walter racconte des conneries et tu le défends contre vents et marées vous êtes pitoyables tous les deux

Portrait de Walter

Cet remarque prouve bien que tu lis les posts à moitiés, Jetfuzz n'a absolument pas dit que tu avais supprimé des posts, mais que SPI l'avait fait!!!

Peut tu nous dire pour qui on prend les gens?

J'attends toujours ton explication sur mes torts et les conneries que je raconte!

Portrait de Manoé

Je pense que vous devriez vous pacser tous les deux pour ma part je ferais comme si vous n'existiez pas depuis cet instant !

Portrait de Walter

Un pacs, quel idée saugrenue, quel est le rapport, cela ce veut il insultant ou désobligeant ?
C'est étonnant mais ta réaction est exactement ce qu'avait prédit Jetfuzz :) 
C'est tellement plus facile de se dérober que de devoir ce justifier, après avoir fait le caid!
Mais finalement c'est sûrement ta façon de reconnaître tes tort.

Portrait de Manoé

Toinoobz

Si tu veux comparez des tableaux entre eux, la seule façon que je connaisse est de comparez chaque élément indicé de chaque tableau  soit comme exemple :

char A[4] = {1, 2, 3, 4};
char B[4] = {'a', 2, 'c', 4};
char C[4] = {1, 2, 3, 4};
char D[4] = {'a', 2, 'c', 4};
int n;
String Etat;

void setup() {
  Serial.begin(230400);
  Serial.println("Soit: ");
Serial.println("A[4] = {1, 2, 3, 4};");
Serial.println("B[4] = {'a', 2, 'c', 4};");
Serial.println("C[4] = {1, 2, 3, 4};");
Serial.println("D[4] = {'a', 2, 'c', 4};");
Serial.println();
 
Etat = " est égal à ";
for ( n=0;n<4;n++){
if (A[n]!=B[n])
Etat = " est different de ";}
Serial.println ("A[]" + Etat+ "B[]");

Etat = " est égal à ";
for ( n=0;n<4;n++){
if (A[n]!=C[n])
Etat = " est different de ";}
Serial.println ("A[]" + Etat+ "C[]");

Etat = " est égal à ";
for ( n=0;n<4;n++){
if (A[n]!=D[n])
Etat = " est different de ";}
Serial.println ("A[]" + Etat+ "D[]");

Etat = " est égal à ";
for ( n=0;n<4;n++){
if (B[n]!=C[n])
Etat = " est different de ";}
Serial.println ("B[]" + Etat+ "C[]");

Etat = " est égal à ";
for ( n=0;n<4;n++){
if (B[n]!=D[n])
Etat = " est different de ";}
Serial.println ("B[]" + Etat+ "D[]");

Etat = " est égal à ";
for ( n=0;n<4;n++){
if (C[n]!=D[n])
Etat = " est different de ";}
Serial.println ("C[]" + Etat+ "D[]");
}
void loop() {
 //Rien
}

Ce qui donne le résultat suivant sur le moniteur série :

Soit:
A[4] = {1, 2, 3, 4};
B[4] = {'a', 2, 'c', 4};
C[4] = {1, 2, 3, 4};
D[4] = {'a', 2, 'c', 4};

A[] est different de B[]
A[] est égal à C[]
A[] est different de D[]
B[] est different de C[]
B[] est égal à D[]
C[] est different de D[]

Il y a peut être plus simple mais je ne connais que cette solution