Problème de'affichage d'un char

Bonjour à tous et bonne année!

J’ai un petit probleme basic qui me trouble

Je déclare une variable ainsi:
(C’est une variable global)

#define FILESIZE 15 // 33-33-33.txt
#define SD_PATHSIZE 20
char logFile[SD_PATHSIZE+FILESIZE];

C’est donc un char. Ensuite, je luis donne une valeur et j’aincrémente le ficher s’il est deja enregistré sur la carte SD

if (!sd.begin(CHIPSELECT)) {
      Serial.println(F("Card init. failed! Check SD card"));
      isOk = false;
      blinkLed(LED1_PIN,10,50); 
    }
    else
    {
      isOk = true;
      if(!sd.chdir())
      {
        Serial.println(F("Could not chdir root"));
      }
      sprintf(logFile,"%s","adalog00.txt");
      // Check if file exist sarting from ADALOG00.TXT
      for (uint8_t i = 0; i < 100; i++)
      {
       logFile[6] = '0' + i/10;
       logFile[7] = '0' + i%10;
       // create if does not exist, do not open existing, write, sync after write
       if (! sd.exists(logFile))
       {
         break;
       }
     }

Ensuite, je veux voir si tout est ok, alors je fais une boucle for

sprintln(F("Check logFile name:"),2);
    for(int ee=0; ee < strlen(logFile); ee++)
    {
      sprint(ee,2);
      sprint(F(">"),2);
      Serial.print(logFile[ee]);
      Serial.print(F(" "));
      sprintln(logFile[ee],2);
    }

Je ne comprends pas pourquoi, le

  Serial.print(logFile[ee]);

affiche bien les caractère (a;d;a;l; etc…)

mais le sprintln(logFile[ee],e)
affiche des chiffres.

Pourquoi c’est

void sprintln(int message, int logToSd)

qui est appelé, alors que

logFile[ee]

contient un caractere et que

void sprintln(char * message, int logToSd)

existe!!

Pour être plus précis, voic mes fonctions sprintln().

void sprintln(int message, int logToSd)
{
  #ifdef WATCHDOG
    Watchdog.reset();
  #endif
  
  if(logToSd == 0 || logToSd == 2)
  { 
    Serial.println(message);
  }
  
  if(logToSd == 1 || logToSd == 2)
  {
    #ifdef LOGGER
       char mess[10];
      sprintf(mess,"%d",message);
      sd_writeln(logFile,mess);
    #endif
  }
}

void sprintln(char * message, int logToSd)
{
  #ifdef WATCHDOG
    Watchdog.reset();
  #endif
  if(logToSd == 0 || logToSd == 2)
  { 
    Serial.println(message);
  }
  
  if(logToSd == 1 || logToSd == 2)
  {
    #ifdef LOGGER
      sd_writeln(logFile,message);
    #endif
  }
}


void sprintln(const __FlashStringHelper * message, int logToSd)
{
  #ifdef WATCHDOG
    Watchdog.reset();
  #endif
  
  if(logToSd == 0 || logToSd == 2)
  {
    Serial.println(message);
  }
  
  if(logToSd == 1 || logToSd == 2)
  {
    #ifdef LOGGER
      sd_writeln(logFile, message);
    #endif
  }
}

void sprintln(char const * message, int logToSd)
{
  #ifdef WATCHDOG
    Watchdog.reset();
  #endif
  
  if(logToSd == 0 || logToSd == 2)
  {
    Serial.println(message);
  }
  
  if(logToSd == 1 || logToSd == 2)
  {
    #ifdef LOGGER
      sd_writeln(logFile, message);
    #endif
  }
}

pierrot10:
Bonjour à tous et bonne année!

Bonne année!


pierrot10:
Je déclare une variable ainsi:
(C’est une variable globale)

#define FILESIZE 15 // 33-33-33.txt

#define SD_PATHSIZE 20
char logFile[SD_PATHSIZE+FILESIZE];




C'est donc un char.

Non, vous déclarez un tableau de char, donc logFile est un pointeur, l’adresse du début du tableau. logFile[6] par exemple est un char, le 7ème élément du tableau.


      sprintf(logFile,"%s","adalog00.txt");

pourquoi utiliser sprintf? strcpy est plus adapté pour initialiser votre tableau avec une chaîne sans paramètres et évitera de surcharger votre mémoire programme avec le code de sprintf qui est conséquent.


pierrot10:
Pourquoi c’est
Code: [Select]
void sprintln(int message, int logToSd)

qui est appelé, alors que
Code: [Select]
logFile[ee]

contient un caractere et que
Code: [Select]
void sprintln(char * message, int logToSd)

cf en 1. logFile[ee] c’est un char comme étant un élément du tableau. Comme vous n’avez pas de prototype gérant des char et qu’un char peut être promu en int (pas en char* (pointeur sur caractère)) c’est cette fonction là que le compilateur retiendra. La seconde version de sprintln prend un pointeur sur une chaîne (char *), vous pourriez l’appeler en passant logFile qui lui est bien un pointeur.

Merci J-M-L pour tes explications.