[Programmation] Arduino comparaison array of string avec array of char.. 2 jours.. ouff...
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Arduino comparaison array of string avec array of char.. 2 jours.. ouff...



  1. #1
    invite1b5cd6fb

    Smile Arduino comparaison array of string avec array of char.. 2 jours.. ouff...


    ------

    Bonjour a tous.

    J'essaie de comparer les numéros sur ma carte sd avec le no de l'appel entrant, et sur mon écran lcd pour mon array of String, j'ai un petit caractère qui apparaît tandis que mon array of char, il n'y a rien qui apparaît apres. Donc il me renvoie toujours que le no n'est pas a bloquer.

    Cela fait deux soirées que j'essaie de résoudre mon problème, voici mon code :

    Code:
    #include <LiquidCrystal_I2C.h>
    #include <Wire.h> 
    #include <SPI.h>
    #include <SD.h>
    
    #define BLACKL_FILE "BLACKL.txt"
    
    bool caller_blocked = false;
    int NB_CALLER_TO_BLOCK = 0;
     
    #define MAX_CALLER_BLOCKED 5        // MAX D'APPELS A BLOQUER!!!
    String result[MAX_CALLER_BLOCKED]; 
    
    File file;
    const int CS_PIN = 10;
    
    char num[12];
    volatile int lignes = 0;
    
    LiquidCrystal_I2C lcd(0x27, 20, 4);
    
    /////////////////////////////////////////////////
    bool initializeSD(){
      Serial.println(F("Initializing SD card..."));
      pinMode(CS_PIN, OUTPUT);
    
      Serial.print(F("Initializing SD card..."));
      if (!SD.begin(CS_PIN)) {
        Serial.println(F("initialization failed!"));
        return false;
      }
      Serial.println(F("initialization done."));
      return true;
    }
    
    int createFile(char filename[])
    {
      file = SD.open(filename, FILE_WRITE);
    
      if (file)
      {
        //lcd.setCursor(0,0);
        //lcd.print("File created!");
        Serial.println(F("File created successfully."));
        return 1;
      } else
      {
        //lcd.setCursor(0,0);
        //lcd.print("File not created!");
        Serial.println(F("Error while creating file."));
        return 0;
      }
    }
    
    int writeToFile(char text[])
    {
      if (file)
      {
        file.println(text);
        Serial.println(F("Writing to : "));    
        return 1;
      } else
      {
        Serial.println(F("Couldn't write to file"));
        return 0;
      }
    }
    
    void closeFile()
    {
      if (file)
      {
        file.close();
        Serial.println(F("File closed"));
      }
    }
    
    int openFile(char filename[])
    {
      file = SD.open(filename);
      if (file)
      {
        Serial.println(F("File opened with success!"));
        return 1;
      } else
      {
        Serial.println(F("Error opening file..."));
        return 0;
      }
    }
    
    String readLine(){
      String received = "";
      char ch;
      while (file.available())
      {
        ch = file.read();
        if (ch == '\n')
        {
         return String(received);
        }
        else
        {
          received += ch;
        }
      }
      return "";
    }
    
    
    bool Caller_Blocked(char numero[12]){
     //String myStr = numero_appel_entrant
     int compteur = 0;
    
     //numero+= '\0';
     //String myStr = numero;
      
     Serial.println(""); 
    
    int test = SD.exists(BLACKL_FILE);   
    if (test){
     openFile(BLACKL_FILE);
     // compteur le nombre de lignes dans le fichier 
     while (readLine()!= "")
      NB_CALLER_TO_BLOCK++;  // incrémente le nombre de lignes.. ou caller a bloquer...
    } 
     closeFile();
    
    
     Serial.print("NB_CALLER_TO_BLOCK = ");
     Serial.println(NB_CALLER_TO_BLOCK);
    
    char ch;
    // Ne pas oublier de l'ouvrir HI HI HI! :)
    openFile(BLACKL_FILE);
     while (file.available())
      {
        ch = file.read();
        if (ch != '\n'){
         result[lignes] += ch;
         //Serial.print(ch);
         //Serial.println("");
         
         compteur++;
         if (compteur == 12){   
          //result[compteur] = '\0';
          lignes++;   
          compteur = 0;
    
          if (lignes == MAX_CALLER_BLOCKED)
           break;
         } 
        }
      }  
      closeFile(); 
    
    // ici result s'imprimer sur le lcd avec un petit caractère en plus voir la photo....
      for (int i=0;i<NB_CALLER_TO_BLOCK;i++)
       Serial.println(result[i]);
    
    
    // ca s'imprimer bien .. 
     lcd.setCursor(0,2);
     lcd.print(numero);
    
    
    // je ne sais pu trop quoi faire ici... j'ai tout essayer... 
    /*
      for (int i=0;i<NB_CALLER_TO_BLOCK;i++){
       if (strcmp(result[i].c_str(), numero) == 0)
        return true;
      }
    */
      return false;
    }
    
    
    void setup(){
     Serial.begin(9600);
     Serial.println("Go.");
    
     lcd.begin();    
     lcd.noBacklight();
     delay(400);
     lcd.clear();
     lcd.backlight();
    
     lcd.setCursor(0,0);
     if (initializeSD() == true)
      lcd.print("SD OK!");
     else
      lcd.print("SD FAILED!");
       
     delay(1000); 
    
      // la condition est toujours fausse ici! :-(
     if (Caller_Blocked("15146620231") == true) {
      lcd.print("APPEL BLOQUE!");
     }
     else
         {
          lcd.print("Appel autorise.");
         }
    }
    
    
    void loop(){}
    
    
    Merci de votre précieuse aide!
    Marc.

    -----
    Images attachées Images attachées  

  2. #2
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    ton code;
    Code:
    #define MAX_CALLER_BLOCKED 5        // MAX D'APPELS A BLOQUER!!!
    String result[MAX_CALLER_BLOCKED];
    Comment le type string est il défini ?

    Je doute que Arduino fasse une allocation dynamique au fil de l'eau comme le ferait VisualBasic.

    Si string est une déclaration de chaine statique, il réservera 5 octets sur la partie prog.
    Si string est considéré comme un char 5 octets en ram.
    Dans les 2 cas c est faux !
    Il faut réserver un tableau de char

    Code:
    #define MAX_SIZE_CALLER_BLOCKED 13    //  taille des chaines en mémoire!!!
    #define MAX_CALLER_BLOCKED 5             // MAX D'APPELS A BLOQUER!!!
    char result[MAX_SIZE_CALLER_BLOCKED][MAX_CALLER_BLOCKED];

  3. #3
    invite830075ec

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Salut,
    On ne sait pas ce qu'il y a dans ton fichier blacklist.
    La fonction writeToFile(txt) fait un println(txt), qui ajoute 2 caractères au texte , CR et LF.
    Si elle a été utilisée pour créer le fichier, lors de la lecture du fichier, on s'arrête sur LF, donc le CR est considéré comme une data parasite.

  4. #4
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    non , c est bon !
    il lit la ligne terminé par '\n'
    et met la chaine à la longueur 12 avec '\0'

  5. A voir en vidéo sur Futura
  6. #5
    invite1b5cd6fb

    Smile Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Merci a Pat!

    J'ai beaucoup progressé!
    Il me suffit de comparer au array of char de l'appel entrant. Il est présentement 19:56 et c'est début 18:00 que j'essaie mais sans succès.

    Voici le code :

    Code:
    #define MAX_SIZE_CALLER_BLOCKED 12    //  taille des chaines en mémoire!!!
    const int MAX_CALLER_BLOCKED = 5;             // MAX D'APPELS A BLOQUER!!!
    char result[MAX_SIZE_CALLER_BLOCKED][MAX_CALLER_BLOCKED];
    
    int lignes = 0;
    
    bool Caller_Blocked(char numero[12]){
    int compteur = 0;
      
     Serial.println(""); 
    
    int test = SD.exists(BLACKL_FILE);   
    if (test){
     openFile(BLACKL_FILE);
     // compteur le nombre de lignes dans le fichier 
     while (readLine()!= "")
      NB_CALLER_TO_BLOCK++;  // incrémente le nombre de lignes.. ou caller a bloquer...
    } 
     closeFile();
    
    char ch;
    // Ne pas oublier de l'ouvrir HI HI HI! :)
    openFile(BLACKL_FILE);
     while (file.available())
      {
        ch = file.read();
        if (ch != '\n'){
          result[compteur][lignes] = ch;
              
         compteur++;
         if (compteur == 12){   
          lignes++;   
          
          compteur = 0;
    
          if (lignes == MAX_CALLER_BLOCKED)
           break;
         } 
        }
      }  
      closeFile(); 
    
    /*
     for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
      Serial.print(result[i][0]);
     }
     Serial.println("");
    
     for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
      Serial.print(result[i][1]);
     }
     Serial.println("");
    
     for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
      Serial.print(result[i][2]);
     }
    
     Serial.println("");
    */
    
     unsigned short mon_compteur = 0;
    
    /*
    for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
     if (mon_compteur == 0){
      Serial.println("-------------------");
      Serial.println("compteur 0");
      Serial.print("Numero :");Serial.println(numero);
      Serial.print(result[0][mon_compteur]);  
      Serial.println("");
      Serial.println("-------------------");
      Serial.println("");
     }
     */ 
    
    /*
      Serial.println("-------------------");
      Serial.println("compteur 1");
      Serial.print("Numero :");Serial.println(numero);
      Serial.print(result[i][mon_compteur]);  
      Serial.println("");
      Serial.println("-------------------");
      Serial.println("");
     } 
    
    /*
     if (mon_compteur == 2){
      Serial.println("-------------------");
      Serial.println("compteur 2");
      Serial.print("Numero :");Serial.println(numero);
      Serial.print(result[i][mon_compteur]);  
      Serial.println("");
      Serial.println("-------------------");
      Serial.println("");
      }
    */ 
     //}
    
    /*
     for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
      Serial.print(result[i][0]);
     }
     Serial.println("");
    */
     
    /*
     for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
      Serial.print(result[i][0]);
     }
     Serial.println("");
    */
    
     Serial.print("resultat 0 = ");
      for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
       Serial.print(result[i][0]);
      }
      Serial.println("");
    
      for (int i=0;i<MAX_SIZE_CALLER_BLOCKED;i++){
       while(mon_compteur<=MAX_CALLER_BLOCKED)
       {
        if (result[i][mon_compteur] == numero[i])
          return true;
        else
         {
          mon_compteur++;  
          break;
         }
       }
      }
     
     return false;
    L'appel apparait toujours bloqué!! .
    Pouvez-vous m'aider??

    Merci énormément encore, sans vous je ne serais pas a cette étape!

  7. #6
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    c est faux !
    Code:
        if (result[i][mon_compteur] == numero[i])
          return true;
        else
         {
          mon_compteur++;  
          break;
         }
    La comparaison de chaine se fait avec la fonction strcmp() ou strncmp()
    strcmp(str1,str2) compare à l'identique
    strncmp(str1,str2,n) compare n caractères
    Le résultat est 0 si c est vrai

    if ( strcmp(result[i][mon_compteur] ,numero[i])) ==0 )

    ou

    if ( strncmp(result[i][mon_compteur] ,numero[i]),12) ==0 )


    1ère référence trouvé sur google;
    http://www.cplusplus.com/reference/cstring/strcmp/

  8. #7
    invite830075ec

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    char result[MAX_CALLER_BLOCKED][MAX_SIZE_CALLER_BLOCKED];
    est mieux et attention à bien placer les 2 indices de tableau

    Le bug c'est l'afficheur qui le montre, Serial.print() n'y voit que du feu
    Tu traînes toujours le caractère parasite CR et tu ne termines pas tes chaînes C par un '\0';
    (avec l'objet String c'était implicite)

  9. #8
    bobflux

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Citation Envoyé par freepicbasic Voir le message
    Comment le type string est il défini ?

    Je doute que Arduino fasse une allocation dynamique au fil de l'eau comme le ferait VisualBasic.
    Si, si, c'est dynamique avec malloc() et free() sur le buffer, et donc la fonction qui retourne un String fait une copie (malloc, free du temporaire, etc).

  10. #9
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Citation Envoyé par bobfuck Voir le message
    Si, si, c'est dynamique avec malloc() et free() sur le buffer, et donc la fonction qui retourne un String fait une copie (malloc, free du temporaire, etc).
    si tu as un lien de référence qui explique ça.
    ça m'intéresse , j ai pas trouvé.

  11. #10
    bobflux

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    J'ai regardé dans les sources

  12. #11
    carcan

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Hello !

    attention au LCD.println ... j'ai eu le cas avec un afficheur I2C, il ne digérait pas le ln et affichait un caractère similaire au tien !

    A+
    Laurent

  13. #12
    invite1b5cd6fb

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Voici ce que j'obtiens quand je fais le code : strcmp :

    string.h:125:12: error: initializing argument 1 of 'int strcmp(const char*, const char*)' [-fpermissive]
    extern int strcmp(const char *, const char *) __ATTR_PURE__;

    Merci!
    A+!
    Marc.

  14. #13
    invite1b5cd6fb

    Smile Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Problème résolu par :

    int cnt = 0;
    for (int i=0;i<MAX_SIZE_CALLER_BLOCKED-1;i++)
    if (result[i][0] == numero[i] || result[i][1] == numero[i] || result[i][2] == numero[i] ||
    result[i][3] == numero[i] || result[i][4] == numero[i])
    cnt++;

    if (cnt == 11)
    return true;
    else
    return false;

    Merci a tous!

    Marc.

  15. #14
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    bizarre ton code ...

    Le source de strcmp

    Code:
    int
    strcmp(const char *s1, const char *s2)
    {
        for ( ; *s1 == *s2; s1++, s2++)
    	if (*s1 == '\0')
    	    return 0;
        return ((*(unsigned char *)s1 < *(unsigned char *)s2) ? -1 : +1);
    }

  16. #15
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Citation Envoyé par bobfuck Voir le message
    J'ai regardé dans les sources
    drôle de lien ...

    Donc ce n'est pas une fonction référencée par arduino, mais une construction dans une application.

  17. #16
    bobflux

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Citation Envoyé par freepicbasic Voir le message
    drôle de lien ...

    Donc ce n'est pas une fonction référencée par arduino, mais une construction dans une application.
    C'est les sources des libs arduino...

    https://github.com/arduino/Arduino/b...uino/WString.h
    https://github.com/arduino/Arduino/b...no/WString.cpp

  18. #17
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    ....................... .......................
    C est pas un type mais une class donc un objet complexe !

    Un éléphant pour écraser une puce 99% de code inutile ...
    Déjà que la programmation objet n'est pas vraiment adaptée pour un Arduino, Là c est le pompon

    Les gars programment un µc comme si c'était un PC avec 64GO de RAM !

    Le source du strcmp est bien suffisant avec 1 tableau de char ou quelques malloc...

  19. #18
    bobflux

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Citation Envoyé par freepicbasic Voir le message
    Un éléphant pour écraser une puce 99% de code inutile ...
    Oui, n'est-ce pas !

    Celui qui veut un langage dynamique, il peut prendre MicroPython...

    Citation Envoyé par freepicbasic Voir le message
    Les gars programment un µc comme si c'était un PC avec 64GO de RAM !
    Manipuler du texte en C.... hum. Puisqu'il s'agit de lire un fichier ligne par ligne, autant utiliser fgets() dans un buffer alloué sur la pile comme au bon vieux temps. Ça ne se démode pas...

  20. #19
    invite830075ec

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Le problème c'est pas le langage, c'est que depuis le début de ce post, le gars lit une chaîne de 12 caractères dans un fichier, la compare à une chaîne de 11 caractères , et veut à tout prix arriver à les faire coïncider.
    et on a pas bougé d'un iota

  21. #20
    bobflux

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    c'est fâcheux en effet...

  22. #21
    invitef86a6203

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    l'erreur classique de débutant , le 0 compte pour 1, il faut terminer à [11], puisqu'il incrémente d'abord .
    De plus la ligne semble avoir disparue dans le dernier exemple.

    Il devrait utiliser le strncmp(str1,str2,11) pour être sur, mais bon ...

  23. #22
    invite830075ec

    Re : Arduino comparaison array of string avec array of char.. 2 jours.. ouff...

    Le passage aux tableaux C l'a envoyé dans le décors, l'objet le protégeait.

Discussions similaires

  1. [Programmation] Arduino comparer String[] avec un char[]
    Par invite1b5cd6fb dans le forum Électronique
    Réponses: 2
    Dernier message: 22/02/2016, 10h34
  2. [Programmation] error: invalid types 'double[int]' for array subscript -- Arduino
    Par invite0e51a8dd dans le forum Électronique
    Réponses: 15
    Dernier message: 26/12/2015, 20h52
  3. Récupérer une valeur dans un array qui est lui même dans un array
    Par invitea1400dd5 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/12/2014, 01h01
  4. convertir un byte array[] en wav avec c#
    Par invited5b00756 dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 01/06/2012, 12h11
  5. [Biologie Moléculaire] [DNA array] Souci reccurent avec le rouge
    Par invite17a570c1 dans le forum Biologie
    Réponses: 4
    Dernier message: 26/08/2009, 12h14
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...