Go Down

Topic: Afficher contenu Chaine de caractere (Read 5667 times) previous topic - next topic

PITP2

Bonjour à tous,
je cherche à stocker les caractères situés entre deux ; dans un tableau puis d'afficher le mot ainsi créé.

J'arrive à isoler le texte entre les deux ; et je stocke le mot dans une variable de type char mot[]
mais je n'arrive pas à ensuite afficher ce mot en entier.
Quelle est la syntaxe pour afficher ce tableau mot ?
Ou faut il balayer le tableau caractère par caractère ?


Code: [Select]
#include <SD.h>

File myFile;

void setup()
{
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  char data[3000];
  char caractere;
  char mot[15];
  int i = 0;
  int j = 0;
 
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
   
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      i++;
    caractere = (myFile.read());
   
    if (caractere == (';')) {
      Serial.print("ca marche");
      j = 0;
    do
    {  i++;
       j++;
      caractere = (myFile.read());
      data[i] = caractere;
      mot[j] = caractere;
    Serial.write(data[i]);
    Serial.print(mot);
  Serial.print("idem");
    } while ((caractere != (';')) && (myFile.available()));
           
    }
      data[i] = caractere;
    Serial.write(data[i]);
   // Serial.println(i);
    }
   
    // close the file:
    myFile.close();
  } else {
  // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
// nothing happens after setup
}

barbudor

#1
Sep 23, 2012, 12:50 pm Last Edit: Sep 23, 2012, 08:51 pm by barbudor Reason: 1
Tes incréments sont mal placés

Par exemple, tu commence par incrémenter i en début de boucle puis tu met quelque chose dans data[ i]
Donc tu écris a l'index 1 du tableau au lieu de 0

pareil avec mot
Tu incrément d'abord j puis tu ecris dans mot[j] c'est à dire à partir de 1
Donc quand tu affiche mot, à l'index 0 il y a problamement un code '\0' == fin de chaine.

fdufnews

En plus de ce que dit barbudor, la méthode print() manipule des chaînes de caractères. Une chaîne de caractères doit se finir par un \0 sous peine "d'afficher" tout le contenu de la mémoire. Il faut donc mettre un \0 à la fin du tableau avant de faire un print.

PITP2

en effet j'ai fait les modifs et cela semble un peu plus correct à l'affichage mais pas encore complètement ca.

j'ai remplacé le print par un write, je ne connais pas bien la différence.

Le texte dans la variable mot ne semble pas initialisé, j'essaie d'y mettre la valeur vide avec la syntaxe suivante
mot == "";   est ce correct ? si c'est bon alors je ne sais pas pourquoi je n'arrive pas à afficher ce qu'il y a dans mot .. ou alors je ne charge pas correctement les caractères.



Code: [Select]
/*
  SD card read/write
 
#include <SD.h>

File myFile;

void setup()
{
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
 
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
  char data[3000];
  char caractere;
  char mot[50];
  int i = 0;
  int j = 0;
  mot == "";
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
   
    // read from the file until there's nothing else in it:
    while (myFile.available()) {
     
   
    if (caractere == (';')) {
      Serial.print("ca marche");
      j = 0;
      i = 0;
      mot == "";
    do
    {
     
      caractere = (myFile.read());
      data[i] = caractere;
      mot[j] = caractere;
    Serial.write(data[i]);
    Serial.write(mot);
    // Serial.print("idem");
       i++;
       j++;
    } while ((caractere != (';')) && (myFile.available()));
           
    }
      caractere = (myFile.read());
      data[i] = caractere;
    Serial.write(data[i]);
   // Serial.println(i);
    }
   
    // close the file:
    myFile.close();
  } else {
  // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop()
{
// nothing happens after setup
}

fdufnews

#4
Sep 24, 2012, 08:41 am Last Edit: Sep 24, 2012, 08:44 am by fdufnews Reason: 1
Quote
j'ai remplacé le print par un write, je ne connais pas bien la différence.

Un print manipule des chaines de caractères. Comme le print qui envoie des chaines à la console.
Un write manipule des octets sans s'occuper de leur valeur.

Quote
Le texte dans la variable mot ne semble pas initialisé, j'essaie d'y mettre la valeur vide avec la syntaxe suivante
mot == "";   est ce correct ?

Non ce n'est pas correcte et pour 2 raisons. En C on ne peut pas affecter une chaine à une autre comme ça. En plus l'opérateur == est un opérateur de test (test d'égalité) qui retourne un booléen.
Mot représente un pointeur sur un tableau en faisant mot = ""; tu modifies le pointeur pas son contenu.
Si tu veux initialiser ta chaine le plus simple c'est de faire:
Code: [Select]
mot[0] = "\0";
L'autre solution c'est d'utiliser des objets String (attention à la majuscule). Voir là http://arduino.cc/en/Reference/StringObject. Dans la librairies String il y a des surcharges d'opérateurs classiques qui permettent de faire des affectations de chaines avec = et des concaténation avec +.

PITP2

Impec , j'ai testé et cela fonctionne !

Merci beaucoup

Go Up