[RESOLU] Printf qui n'affiche rien avec %s?

Bonjour,
Sur le code ci-dessous j'ai un problème bizarre
Pour le premier printf, ca affiche bien la variable, mais dans le deuxième
printf, ca n'affiche pas la variable, tous ce qui est avant %s ne s'affiche pas.

 case State::UnknownCommand:
      {
        Terminal.printf("lastCmd: %s\r\n", lastCmd);
        Terminal.printf("%s is not recognized as an internal command\r\n", lastCmd);
        Terminal.print(F("or external, an executable program or a batch file.\r\n"));
        state = State::Prompt;
      }
      break;

Pour le 2ème printf, ca commence par

is not recognized as an internal etc...
lasCmd est juste un tableau de caractères que j'ai rempli avant

Si je remplace le deuxieme printf,

Terminal.printf par
Serial.printf
La variable est bien affichée sur le moniteur d'Arduino

Ceci ne fonctionne pas non plus.

 case State::UnknownCommand:
      Terminal.printf("%s is not recognized as an internal command\r\nor external, an executable program or a batch file.\r\n", lastCmd);    
      state = State::Prompt;
      break;

Je ne comprends pas.
Avez vous une idée ?

Par contre ceci fonctionne:

Terminal.printf("lastCmd: %s\r\n", lastCmd);

J'ai trouvé la solution mais je ne saurais jamais pourquoi

Le code suivant fonctionne, sauf au lieu d'utilisé lastCmd, j'utilise l'argument passé en ligne de commande qui est stocké dans _argv.

Soit c'est un problème dans le case of ou le loop, car les tests se font dans le loop.
La variable lastCmd n'est jamais modifiée.
Apparemment elle se vide au 2ème printf, peut être un débordement mémoire.

 case State::UnknownCommand:
      Terminal.printf("\'%s\' is not recognized as an internal command\r\nor external, an executable program or a batch file.\r\n", _argv[0]);    
      state = State::Prompt;
      break;

Donc problème résolu sans connaitre le pourquoi.

Il faudrait d'abord que les lecteurs de ta demande sachent que tu utilises FABGL, et qu'ils sachent également ce que représente cette variable Terminal.
J'ai exploré les sources de FABGL. Terminal est une classe qui hérite de Stream, donc de Print
La méthode Print::printf ESP32 est pauvrement équipée d'un buffer de 64 octets.

Je te conseillerais de limiter la taille des variables à afficher avec %s.

Oui c'est possible, il me semble que dans FABGL on peut modifier le buffer, je regarderai cela de plus près.
Mais dans mon cas la variable contenait 4 caractères e elle fonctionne bien ailleurs dans tous le programme.
Mais c'est possible que dans le printf, ce qui est entre guillemet dépasse le buffer.
Ca peut provenir aussi de l'ESP32.

Programme que tu ne publies que par bribes, ce qui empêche tout examen sérieux (classes, variables, portée de celles-ci). Difficile donc d'apporter une aide quelconque.

ah ok moi je parlais de la variable de printf de mon exemple, sinon oui il y a beaucoup de variables mais dans des fonction locales, en global j'en ai quelques unes 4 tableaux de 80 car. quelques booleens, des Enum etc ....
J'utilise des F() pour les printf, un peu de PSRAM.
Par contre pour utiliser FABGL, c'est sur sur que des Terminal.printf ou Terminal.println j'en ai une flopée.

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