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
    nodoubtman

    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. Publicité
  3. #2
    freepicbasic

    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];
    A+, pat

  4. #3
    satinas

    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.

  5. #4
    freepicbasic

    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'
    A+, pat

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    nodoubtman

    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!
    Dernière modification par nodoubtman ; 23/03/2016 à 00h03.

  9. #6
    freepicbasic

    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/
    A+, pat

  10. Publicité
  11. #7
    satinas

    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)

  12. #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).

  13. #9
    freepicbasic

    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é.
    A+, pat

  14. #10
    bobflux

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

    J'ai regardé dans les sources

  15. #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

  16. #12
    nodoubtman

    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.

  17. Publicité
  18. #13
    nodoubtman

    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.

  19. #14
    freepicbasic

    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);
    }
    A+, pat

  20. #15
    freepicbasic

    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.
    A+, pat

  21. #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

  22. #17
    freepicbasic

    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...
    A+, pat

  23. #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...

  24. Publicité
  25. #19
    satinas

    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

  26. #20
    bobflux

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

    c'est fâcheux en effet...

  27. #21
    freepicbasic

    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 ...
    A+, pat

  28. #22
    satinas

    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 nodoubtman dans le forum Électronique
    Réponses: 2
    Dernier message: 22/02/2016, 09h34
  2. [Programmation] error: invalid types 'double[int]' for array subscript -- Arduino
    Par Slaivers dans le forum Électronique
    Réponses: 15
    Dernier message: 26/12/2015, 19h52
  3. Récupérer une valeur dans un array qui est lui même dans un array
    Par squal31 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 28/12/2014, 00h01
  4. convertir un byte array[] en wav avec c#
    Par Pogrebnyak dans le forum Programmation et langages, Algorithmique
    Réponses: 1
    Dernier message: 01/06/2012, 11h11
  5. [Biologie Moléculaire] [DNA array] Souci reccurent avec le rouge
    Par MaliciaR dans le forum Biologie
    Réponses: 4
    Dernier message: 26/08/2009, 11h14
Découvrez nos comparatifs produits sur l'informatique et les technologies.