Bonjour,

sprintf_P() est une fonction pratique, mais chaque appel est coûteux en code

Il est possible de passer la chaine de format en paramètre tout en la laissant en flash, voici un example (la fonction sert à écrire des nombre sous forme de texte à des emplacements précis dans un buffer) :

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
typedef uint16_t FlashAddress;
const char Display_Dec[] PROGMEM = {"%3d"};
const char Display_Hex[] PROGMEM = {"%02X"};
void DisplaySetupMenu() {
	byte i;
	FlashAddress pBuffer;
	for (i=EusOffset;i<EusLen;i++) {
		if (i < EusMac) {
			//sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, PSTR("%3d"), Eus[i]); 
			pBuffer = Display_Dec;
		} else {
			//sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, PSTR("%02X"), Eus[i]); 
			pBuffer = Display_Hex;
		}
		sprintf_P(Buffer_HTTP + PRINT_Text_Setup_First_Text_Address - EusOffset*4 + i*4, pBuffer, Eus[i]); 
	}
	DisplayData();
}
Le type FlashAddress dépend de votre microcontrôleur.

Sur un Arduino UNO, c'est uint16_t car l'UNO a 32ko de flash

Si votre microcontrôleur a plus de 64ko de flash il faut utiliser un uint32_t

A bientôt