Lire les jours dans un char[]: too many initializers

Bonjour
Je sais, on en trouve plein internet de ces cas d'erreur mais je ne trouve pas...

extrait du code:

char DayName[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
Serial.println(DayName[&timeinfo, "%w"]);

le message d'erreur:

C:\Users\simon\Documents\Arduino\codes\Accentra\ntp\ntp.ino: In function 'void printLocalTime()':
C:\Users\simon\Documents\Arduino\codes\Accentra\ntp\ntp.ino:56:90: error: too many initializers for 'char []'
 char DayName[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
                                                                                          ^
C:\Users\simon\Documents\Arduino\codes\Accentra\ntp\ntp.ino:57:39: error: invalid types 'char [9][const char [3]]' for array subscript
 Serial.println(DayName[&timeinfo, "%w"]);
                                       ^

exit status 1

Compilation error: too many initializers for 'char []'

Pour aller plus loin, le code entier:

#include <WiFi.h>
#include "time.h"

const char* ssid     = "Livebox-";
const char* password = "abracadabra";

const char* ntpServer = "ntp.sophia.cnrs.fr";
const long  gmtOffset_sec = 3600 ; //heure Fr
const int   daylightOffset_sec = 3600;

void setup(){
  Serial.begin(115200);

  // Connect to Wi-Fi
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected.");
  
  // Init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  printLocalTime();

  //disconnect WiFi as it's no longer needed
  WiFi.disconnect(true);
  WiFi.mode(WIFI_OFF);
}

void loop(){
  delay(1000);
  printLocalTime();
}

void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }

Serial.println(&timeinfo, "%A");
  // String aujour;
  // if ((&timeinfo, "%A")=="Monday"){aujour="Lun";}
  // if ((&timeinfo, "%A")=="Tuesday"){aujour="Mar";}
  // if ((&timeinfo, "%A")=="Wednesday"){aujour="Mer";}
  // if ((&timeinfo, "%A")=="Thu"){aujour="Jeu";}
  // if ((&timeinfo, "%A")=="Fri"){aujour="Ven";}
  // if ((&timeinfo, "%A")=="Sat"){aujour="Sam";}
  // if ((&timeinfo, "%A")=="Sun"){aujour="Dim";}
  // Serial.println(aujour);
char DayName[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
Serial.println(DayName[&timeinfo, "%w"]);

  Serial.println(&timeinfo, "%R");
  if((&timeinfo, "%R")<"12:00"){Serial.println("c'est le matin");}
  else{Serial.println("Apres midi");}

}

hmm ca serait bien une histoire de conversion de variables ça :roll_eyes:

Un tableau de char attends des char pas des c-string

oui, j'ai fait la même bêtise avec if((&timeinfo, "%R")<"12:00")
Je mélange les types de variables ... compliqué
J'ai l'impression que C est vraiment tatillon avec les types de variables, plus que Python ou même javascript

Oui faut vraiment dire ce que l’on veut :slight_smile:

Ici il aurait fallu mettre

Ca débloque.
Cependant

const char * dayName[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
const char * a=(&timeinfo, "%w");
int b = (a.toInt());
Serial.println (dayName[b]);```

renvoie

C:\Users\simon\Documents\Arduino\codes\Accentra\ntp\ntp.ino: In function 'void printLocalTime()':
C:\Users\simon\Documents\Arduino\codes\Accentra\ntp\ntp.ino:50:12: error: request for member 'toInt' in 'a', which is of non-class type 'const char*'
 int b = (a.toInt());
            ^

exit status 1

Compilation error: request for member 'toInt' in 'a', which is of non-class type 'const char*'

La méthode .toInt() s'applique sur un String pas sur une c-string.
Sur une c-string il faut utiliser atoi(a).

En effet, encore une confusion... merci

Sur cette page je lis dans le tableau :face_with_monocle:
%w Weekday as a decimal number with unday as 0 (0-6)
Alors pourquoi ça me renvoie un const * char?
Surtout qu'au final ça ne fonctionne pas lorsque je fais

const char * a=(&timeinfo, "%w");

Sur le moniteur ca m'imprime %w au lieu de me renvoyer une valeur de 0 à 6

const char * dayName[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
const char * a=(&timeinfo, "%w");
Serial.print("a= "); 
Serial.println(a);
int b = (atoi(a));
Serial.print("b= "); 
Serial.println(b);
Serial.print ("dayname[b]= "); 
Serial.println(dayName[b]);

Le moniteur affiche:
a= %w
b= 0
dayname[b]= Dimanche

Tu n'as pas l'impression qu'il manque quelque chose devant les parenthèses?

ça ne fait rien du tout... (enfin ça met un pointeur vers la chaîne constante "%w" dans a)

sur ESP la fonction print connait le type struct tm et donc on peut faire

  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");

un peu de la même manière qu'on peut imprimer un float avec 4 chiffres après la virgule en faisant

  Serial.println(unFloat, 4);

mais ce n'est que la fonction print qui sait faire cela.

peut-être tenter un sprintf()

donc ça ne peut pas se stocker dans une variable? :face_exhaling: :face_with_spiral_eyes:

ben il a une variable de type struct tm et il suffit donc de lire son contenu pour avoir la valeur

Probable dans ce cas qu'un sprintf ferait l'affaire ?
Que donne :

char jour[10];
sprintf (jour, "%w", &timeinfo);
Serial.println (jour)

Edit: je vois que @fdufnews l'a déjà proposé...

timeInfo est une structure qui contient cela (entre autres)

struct tm {
  int tm_sec;           /* Seconds. [0-60] 1 leap second */
  int tm_min;           /* Minutes. [0-59]      */
  int tm_hour;          /* Hours.   [0-23]      */
  int tm_mday;          /* Day.     [1-31]      */
  int tm_mon;           /* Month.   [0-11]      */
  int tm_year;          /* Year - 1900.         */
  int tm_wday;          /* Day of week. [0-6]   */
  int tm_yday;          /* Days in year.[0-365] */
  int tm_isdst;         /* DST.     [-1/0/1]    */
};

donc si vous voulez le jour de la semaine vous demandez timeinfo.tm_wday et si vous voulez votre nom du jour en français avec votre tableau corrigé

const char * DayName[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

vous faites donc

Serial.print(DayName[timeinfo.tm_wday]);
1 Like

%w est une chaîne de format qui s'applique à strftime()
%w représente le jour de la semaine, de 0 à 6.

1 Like

Bon à savoir, merci !

tu m'expliqueras :rofl:

De même %R représente (toujours pour strftime) l'heure en format 24H, sans les secondes.
Je ne vois pas comment la comparaison d'une chaîne "HH:MM" avec "12:00" pourrait fonctionner.
Avec strcmp(), par contre ...
Et il serait forcément plus simple de travailler directement avec les valeurs numériques plutôt que de les convertir en chaînes.
kammo a probablement trop mangé de Python et de JS ces temps-ci.

C'est exactement ce que je me disais :rofl:
je m'emmêle les pinceaux.

Je ne fais pas tout en numérique parce que je vais avoir un souci avec une autre partie de code, celle qui lit les plages horaires rentrées par l'utilisateur:

  server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
    request->send(200, "text/html", homepage);
  });

  server.on("/horloge", HTTP_GET, [] (AsyncWebServerRequest * request) {
    if (request->hasParam("s1")) {
     Serial.print("  horloge1: "); Serial.println(request->getParam("s1")->value());
    }

Je vais me faire un petit café, sortir le chien et me taper la tête dans le mur. :exploding_head: