Deux fonctions identique avec meme code, une fonctionne et pas l'autre

Bonjour,
Je suis sur un problème depuis un jour.

j'ai deux fonctions avec exactement le même code, juste le nom de la fonction qui n'est pas la même, l'une fonctionne bien et l'autre non.

ces deux fonctions sont déclarées comme cela:

bool _esp8266_waitFor(uint24_t time_out, char *wait, bool show);

bool waitFor_buffer(uint24_t time_out, char *wait, bool show);

je récupère les informations qui viennent d'un esp8266 et je l'affiche.

première fonction qui fonctionne:

bool _esp8266_waitFor(uint24_t time_out, char *wait, bool show)
 {
    uint24_t startime = 0;					
	ticker = 0;
    uint16_t so_far = 0;
    char received;
   
    timer0_begin(4608, 4);		
	startime = ticker;
    do {
        if(uart1_kbhit())
		{
            received = _esp8266_getch();           
            if(show) {
                printf("%c", received);
            }
                       
            if (wait[so_far] == received) {
                so_far++;
            } else {
                so_far = 0;
            }
        }
        if(((ticker - startime) > time_out)) break;
    } while (wait[so_far] != 0);
    timer0_end();
    
    return (so_far == strlen(wait));
 }

seconde fonction qui ne fonctionne pas mais le nom de la fonction n'est pas la meme:

bool waitFor_buffer(uint24_t time_out, char *wait, bool show)
 {
    uint24_t startime = 0;					
    ticker = 0;
    uint16_t so_far = 0;
    char received;
   
    timer0_begin(4608, 4);		
	startime = ticker;
    do {
        if(uart1_kbhit())
		{
            received = _esp8266_getch();           
            if(show) {
                printf("%c", received);
            }
                       
            if (wait[so_far] == received) {
                so_far++;
            } else {
                so_far = 0;
            }
        }
        if(((ticker - startime) > time_out)) break;
    } while (wait[so_far] != 0);
    timer0_end();
    
    return (so_far == strlen(wait));
 }

la fonction qui appel une de ces fonction est la suivante, j'ai mis des commentaire // pour tester quand je switch de fonction:

void esp8266_ip(char *store_in)
 {    
    //char tmp[1024];
    uint24_t count;

    _esp8266_print("AT+CIFSR\r\n");    
    waitFor_buffer(timeout*4, "OK\r\n", true);
    //_esp8266_waitFor(timeout*4, "OK\r\n", true);
   
}

le fonctionnement:
lorsque j'en une command AT+CIFSR, la reponse est:
AT+CIFSR
+CIFSR:STAIP,"192.168.2.172"
+CIFSR:STAMAC:"c8:2b:96:2f:47:6a"

OK

pour la première fonction qui fonctionne j'obtiens le résultat plus haut.

pour celle qui ne fonctionne pas j'obtiens:
ATCFS
CIS:SAP,12.68217"
CIS:SAAC"8:b:62f4:6"

Quel est la différence entre ces deux fonctions ?
Merci.

le nom de la fonction ne change rien si le code est identique
vous avez un bug ailleurs

surement mais c'est le meme code, j'ai juste remplacer celle qui fonctionne par une autre mais de nom différents.

c'est comme si dans une fonction je faisait un
printf("hello world");
l'une affiche quelque chose et l'autre avec des bugs.
elles sont utilisées null part ailleurs dans le code, j'essaye de rester logique.

j'ai quand même érasé la flash de l'esp8266 et re flasher le firmware, c'est pareil.

Je m'en suis aperçu quand j'ai fait un copier coller de la première fonction et ajouter un paramètre en changeant de nom et après ca ne fonctionnait pas.

peut être un bug sur un copier coller.

si tout est identique et que c'est juste le nom de la fonction qui change (et que vous n'utilisez pas un nom réservé) il n'y a aucune raison pour que vous ayez un comportement différent.

l'usage de uart1_kbhit(), printf() ou _esp8266_getch() n'est pas classique sur Arduino. êtes vous sûr que leur fonctionnement est nominal ?

je les utilise dans 10 programme différents et son fonctionnelles,

mon programme fonctionnait très bien, d'ailleurs il fonctionne, c'est juste le copier collé de la fonction, je vais la recréer manuellement sans copier collé

il y a peut etre un caractère invisible qui s'est insérer, j'ai pour tant copier coller les deux code sur notepad ou pspad en affichant les caractères spéciaux, je n'ai rien trouvé

si je n'utilise pas la nouvelle fonction, l'application fonctionne mais il me faut la meme avec un paramètre supplémentaire.

je ne veut pas utilisé la surcharge de fonction avec le même nom.

OK pour les fonctions

c'est quand même louche. s'il y avait des caractères irréguliers le compilo ne serait pas content.

avez vous essayé avec un autre nom que waitFor_buffer() ? qu'est-ce que ça fait si le nom est coucou() par exemple ?

en changeant le nom c'est idem ca ne fonctionne pas,
j'ai changé le nom des paramètres ca ne change rien aussi, je vais essayé de déplacé cette fonction plus loin dans le source pour voir.

je ne lai pas précisé mais j'utilise vscode, j'ai aussi relancé vscode.

je ne sais pas.. c'est louche. il y a sans doute autre chose

avez vous activé tous les warning à la compilation?

je ne sais pas trop comme ca compile , mais je vais trouvé une autre solution, je vais utilisé la bonne fonction et ajouter ce que je veux à l'intérieur, je vais aussi investiguer sur ce problème, j'essaierai avec une autre fonction en la rennomant ,déjà pour voir si j'ai le même problème. Merci.

C'est pas un dépassement de capacité de tableau qui provoque ce problème ?

non ca fonctionne très bien, c'est la copie de la même fonction qui ne fonctionne pas,
cette fonction (celle qui fonctionne, je l'utilise plusieurs fois dans le source), si c'était un dépassement, tout le code ne fonctionnerai pas, je récupére les informations avec comme réponse "OK\r\n", partout dans le code, ce sont les commande AT pour esp8266.

essayez de mettre le code sous l'IDE arduino et activez tous les warnings à la compilation

Je pense que vscode respecte beaucoup plus les normes c++ donc l'underscore en début de méthode doit modifier les règles de compilation. En général dans le doute on évite (_Majuscule est même réservé)

il utilise exactement le même compilateur que l'IDE arduino... donc non...

mais c'est vrai que commencer par un _ est un usage réservé

je vais faire du nettoyage dans le code, l'underscore est souvent aussi reservé pour des lib en assembleur.

J'ai fait court, les normes sont les normes. Je pensais que tous le monde comprendrait les settings par défaut ...

Oui ok les options de compilation sont légèrement différentes
(Sur avr VScode fait du code moins optimal)

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