Ecrire une fonction qui accepte les chaines dans la mémoire flash ?

bonjour, je voudrais que la fonction do_something dans le sketch ci-dessous fonctionne.

La réponse est certainement simple, il y a beaucoup de doc sur Internet au sujet de la mémoire flash et de la manière d'y accéder, mais je n'ai rien trouvé qui m'ait conduit à la solution de ce problème précis.

void setup()
{
	do_something("bla bla") ; /// Ok
	do_something(F("bla bla")) ; /// ne compile pas
}

void loop() 
{
}

void do_something(const char text[])
{
	Serial.println(text) ;
}

Je suppose que le résultat de F("bla bla") n'est pas un char

Si tu veux un exemple qui ressemble à ça, tiré de Print.cpp :

size_t Print::print(const __FlashStringHelper *ifsh)
{
  PGM_P p = reinterpret_cast<PGM_P>(ifsh);
  size_t n = 0;
  while (1) {
    unsigned char c = pgm_read_byte(p++);
    if (c == 0) break;
    n += write(c);
  }
  return n;
}

Merci à vous trois. J’ai donc surchargé la fonction. Pour gérer __FlashStringHelper, j’ai compris qu’on ne peut lire les données qu’un octet à la fois (comme expliqué par B@tto). Plutôt que de le reprogrammer, j’ai trouvé la librairie PString qui fait ça pour moi. Voici donc ma solution :

#include <PString.h> /// http://arduiniana.org/libraries/pstring/

void setup()
{
	Serial.begin(9600);
	do_something(F("blah blah")) ;
	do_something("blah") ;
	Serial.println("Done") ;
}

void loop() {}

void do_something(char *t)
{
	String s(t) ;
	s+= " !" ;
	Serial.println(s) ;
}

void do_something(const __FlashStringHelper *t)
{
	char buf[30] ;
	PString s(buf, 30) ;
	s.print(t) ;
	do_something(buf) ;
}

Ou, tant qu’à faire

template<class T>void do_something(const T *t)
{
  Serial.print(t);
  Serial.println(F(" !"));
}

Qui définira do_something pour char et __FlashStringHelper au vol

Ah oui ! Bravo l'idée du template. C'est swag :slight_smile: