IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Manipulation de Strings


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Par défaut Manipulation de Strings
    Bonjour,

    Je viens pour poser une question sur la manipulation de chaine, car je ne m'en sort pas

    Tout d'abord, j'utilise un C pour Arduino (carte de microcontroleurs AVR en open source) Si je precise cela, c'est que toutes les instructions C et C++ ne sont pas reconnue par le compilateur de l'IDE Arduino.

    Donc, mon problème est simple.
    J'utilise un écran LCD en I2C (2x16) dont la Librairie fonctionne parfaitement.
    Mais je souhaiterais lui faire afficher des chaines plus longue que 16 caractères.
    La seule solution est donc de faire un Crawll du texte (défilement de droite à gauche)

    J'ai d'abord ecrit une bout de code pour essayer avec une boucle qui m'afficherait caractère par caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <Wire.h>
    #include "CLCD.h"
     
    CLCD lcd(0x00,16,2);
    char myStrings[]={"Test de Crawll texte pour affichur LCD 2 X 16"};
     
    void setup()
    {
    lcd.init();
    lcd.cursor_off();
    lcd.setBacklight(1);
    Serial.begin(9600);
    }
     
    void loop()
    {
    int posCur = 0;
    lcd.setCursor(0,posCur);
       for (int i = 0; i < 16; i++){
       lcd.print(myStrings[i]);
       lcd.setCursor(0,posCur = posCur +1);
       delay(500);
       }
    }
    Le problème est que ce code ne conviens pas.
    En effet, comme stipulé dans la doc de l'écran, il doit y avoir un delay de 100 mS après la commande qui affiche le texte.
    Donc, le texte s’affiche lettre par lettre et ce délais rend l'affichage long et illisible car il n'efface pas les caractères suivant.
    Donc le texte deviens illisible dès la 2eme boucle (non copié dans le code présenté).

    La solution est donc ailleurs.
    Et devrait donc ressembler a ca :

    Définir la longueur de la chaine
    Ajouter 16 espaces a cette chaine par une concaténation
    Afficher les caractères :
    De 1 à 16
    De 2 à 17
    De 3 à 18
    Etc...

    Si je fais cette concaténation avec 16 espace est pour qu'en fin de boucle, le texte continu à défiler en effaçant à chaque passage les caractères restants.

    Le problème, est là est enfin ma question, comment faire pour couper ma chaine en partie de 16 caractères en décalant de 1 caractère à chaque passage de boucle ?


    Merci pour votre aide
    Cdlt
    Yves

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #line 6
    char myStrings[]={"Test de Crawll texte pour affichur LCD 2 X 16"};
    Je suis étonné que ce code compile...
    À gauche, tu as un tableau de caractères, et à droite un tableau de chaînes de caractères...

    Si tu veux initialiser variable de « type » chaîne de caractères avec une chaîne de caractères constante, il n'y a que des moyens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char myStrings[] = "Test de Crawll texte pour afficher LCD 2 X 16";
    char myStrings[] = {'T','e','s','t',' ','d','e',' ','C','r','a','w','l','l',' ',\
                        't','e','x','t','e',' ','p','o','u','r',' ','a','f','f','i','c','h','e','r',' ',\
                        'L','C','D',' ','2',' ','X',' ','1','6','\0'};
    D'ailleurs, dans ce cas il vaudrait mieux déclarer un tableau de caractères constants, mais ce n'est qu'un avis personnel...


    Pour revenir à nos moutons, il ne faut pas oublier qu'une chaîne de caractères n'est rien d'autre qu'un tableau de caractères, et qu'un tableau se manipule avec des pointeurs.
    Soit une chaîne de caractères stockée via la variable str et de longueur l ; fin représente la fin de cette chaîne de caractères (char* fin = str + l; => *fin == '\0')
    Alors, si 0 <= i <= j <= l :
    • str + i représente le début de la sous-chaîne de str qui commence au i-ème caractère, et de longueur l - i (et se termine à fin)
    • l'intervalle [str + i, str + j) représente la sous-chaîne de str qui commence au i-ème caractère et se termine au j-ème caractère, et est de longueur j - i


    Essaie donc ce genre de choses...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    char const my_string[] = "Une chaine de test pour tester l'affichage en decale";
    char const *p;
    for (p = my_string; *p != '\0'; ++p) /* (*p != '\0') est équivalent à (*p) */
        printf("\"%-16.16s\"\n", p);
     
    /***********************************/
     
    char const my_string[] = "Une chaine de test pour tester l'affichage en decale";
    int l = strlen(my_string);
    int i, j;
    for (i = 0; i < l; ++i)
    {
        putchar('"');
        for (j = 0; (j < 16) && (i + j < l); ++j)
            putchar(my_string[i+j]);
        for ( ; j < 16; ++j)
            putchar(' ');
        puts("\"");
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Par défaut
    Merci pour ta réponse qui m'a bien aidé.

    J'ai modifié ton code en l'adaptant à mon µC et à mon afficheur.
    (Certaine commandes spécifiques à la Librairie utilisée).

    Voilà le code fonctionnel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
     
    #include <Wire.h>
    #include "CLCD.h"
     
    CLCD lcd(0x00,16,2);
    char myStrings[]={
      "Test de Crawll texte pour affichur LCD 2 X 16"};
     
    char s1[] = "orange";
    char s2[] = "red";
     
    void setup()
    {
      lcd.init();
      lcd.cursor_off();
      lcd.setBacklight(1);
      Serial.begin(9600);
    }
     
    void loop()
    {
     
      char const my_string[] = "Une chaine de test pour tester l'affichage en decale";
      int l = strlen(my_string);
      int i, j;
      for (i = 0; i < l; ++i)
      {
        //lcd.clear();
        lcd.setCursor(0,0);
        for (j = 0; (j < 16) && (i + j < l); ++j)
          lcd.print(my_string[i+j]);
        for ( ; j < 16; ++j)
          lcd.print(' ');
     
        delay(200);
      }
    }
     
    Je peux à mon avis encore l’alléger en faire une fonction et l’implémenter dans ma Lib. 
     
    M

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Par défaut
    Merci pour ta réponse qui m'a bien aidé.

    J'ai modifié ton code en l'adaptant à mon µC et à mon afficheur.
    (Certaine commandes spécifiques à la Librairie utilisée).

    Voilà le code fonctionnel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
     
    #include <Wire.h>
    #include "CLCD.h"
     
    CLCD lcd(0x00,16,2);
    char myStrings[]={
      "Test de Crawll texte pour affichur LCD 2 X 16"};
     
    char s1[] = "orange";
    char s2[] = "red";
     
    void setup()
    {
      lcd.init();
      lcd.cursor_off();
      lcd.setBacklight(1);
      Serial.begin(9600);
    }
     
    void loop()
    {
     
      char const my_string[] = "Une chaine de test pour tester l'affichage en decale";
      int l = strlen(my_string);
      int i, j;
      for (i = 0; i < l; ++i)
      {
        //lcd.clear();
        lcd.setCursor(0,0);
        for (j = 0; (j < 16) && (i + j < l); ++j)
          lcd.print(my_string[i+j]);
        for ( ; j < 16; ++j)
          lcd.print(' ');
     
        delay(200);
      }
    }
    Mais sais tu pourquoi je n'arrive pas à remplacer la chaine par une variable ?
    Indispensable pour en faire une commande de ma lib.

    Je vois peut être utiliser des pointeurs et lire l'espace mémoire ou sera rangé ma chaine.
    Le problème est que je débute en C et C++ et que je ne sais pas encore faire ça.

    Je vais continuer à chercher, et si entre temps tu sais pourquoi ou comment remplacer ma chaine en variable, je suis bien sur preneur .

    En attendant, voila une vidéo de mon LCD avec le texte qui défile.

    [ame]http://www.youtube.com/watch?v=JUykBHD1NSA[/ame]

    Merci encore pour cette aide précieuse.

    Cdlt
    Yves

  5. #5
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    La chaîne de caractères à afficher doit être passée en paramètre de ta fonction loop().
    C'est comme la fonction strlen(), qui détermine la longueur de la chaîne passée en paramètre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void loop(char const *my_string)
    {
        (...)
    }
     
    /********** À l'appel ***/
     
    loop("toto");
     
    char const s[] = "titi";
    loop(s);

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 5
    Par défaut
    J’essaie ça

    Encore merci

    Cdlt
    Yves

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 36
    Par défaut
    Cela ne va pas compiler, il travaille sur un environnement particulier (Arduino).

    Loop() doit avoir le prototype void loop(void), c'est une fonction appelée indéfiniment (comme son nom l'indique ^^) par le micro contrôleur de la carte et qui contient le coeur de son programme

Discussions similaires

  1. [c#] Comment manipuler des string ?
    Par Mickey.jet dans le forum C#
    Réponses: 4
    Dernier message: 27/05/2009, 08h14
  2. fonction manipulant une string
    Par salseropom dans le forum C
    Réponses: 16
    Dernier message: 21/02/2006, 13h18
  3. [STRING] Manipulation de string
    Par Hoegaarden dans le forum Langage
    Réponses: 2
    Dernier message: 30/11/2005, 14h46
  4. [java] manipulation de string
    Par n8ken dans le forum Langage
    Réponses: 3
    Dernier message: 15/11/2005, 11h08
  5. [MFC] Manipulation de string
    Par mulot49 dans le forum MFC
    Réponses: 2
    Dernier message: 24/08/2004, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo