printf limite taille de string
Bonjour à tous
Je ne vois pas où est l'erreur : Serial.printf est incapable de formatter un String d'une longueur supérieure à 10 alors que Serial.print y parvient.
S'agit-il d'un bug ou d'une erreur de ma part
Je préfèrerais une erreur de ma part mais laquelle ?
Merci et bonne journée
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| String toto;
void setup() {
Serial.begin(74880);
delay(500);
Serial.println();
toto = "";
for (int i = 0; i< 12; i++) {
toto = toto + "a";
Serial.println((String) "valeur de toto (longueur = " + toto.length() + ", " + toto);
Serial.printf("valeur de toto (longueur = %d), %s\n", toto.length(), toto);
}
}
void loop() {} |
Le code ci-dessus produit ce résultat :
valeur de toto (longueur = 1, a
valeur de toto (longueur = 1), a
valeur de toto (longueur = 2, aa
valeur de toto (longueur = 2), aa
valeur de toto (longueur = 3, aaa
valeur de toto (longueur = 3), aaa
valeur de toto (longueur = 4, aaaa
valeur de toto (longueur = 4), aaaa
valeur de toto (longueur = 5, aaaaa
valeur de toto (longueur = 5), aaaaa
valeur de toto (longueur = 6, aaaaaa
valeur de toto (longueur = 6), aaaaaa
valeur de toto (longueur = 7, aaaaaaa
valeur de toto (longueur = 7), aaaaaaa
valeur de toto (longueur = 8, aaaaaaaa
valeur de toto (longueur = 8), aaaaaaaa
valeur de toto (longueur = 9, aaaaaaaaa
valeur de toto (longueur = 9), aaaaaaaaa
valeur de toto (longueur = 10, aaaaaaaaaa
valeur de toto (longueur = 10), aaaaaaaaaa
valeur de toto (longueur = 11, aaaaaaaaaaa
valeur de toto (longueur = 11), ⸮⸮⸮?
valeur de toto (longueur = 12, aaaaaaaaaaaa
valeur de toto (longueur = 12), ⸮⸮⸮?
arduino printf avec String
@Jay M
MERCI!
J'ai testé dès que j'ai pu et c'était bien le problème.
Avant cela j'ai cherché partout et testé un bout de programme pour mettre en valeur le problème.
Ce qui me gêne c'est que je n'ai vu nulle part que printf ne traitait correctement que les c_string.
Ce qui est surprenant c'est la limitation à 10 caractères ce qui ne m'a pas rendu la tâche facile..
Je n'ai fait cette concaténation de String que pour mettre en évidence le problème qui semblait lié à la taille du String.
Dans le programme d'origine je n'ai pratiqué pas cela.
Une petite question pour finir : la mémoire souffre-t'elle autant lors de concaténations si on travaille avec une taille spécifiée, ex :String toto[14]; et dernière possibilité l'utilisation de la clause reserve()?
Non je rigolais, ce n'est pas fini; j'aimerais connaitre la structure en mémoire d'un String, pour un C_String je suppose que c'est un tableau de carcatères suivi d'un byte à 0x00?
j'aimerais connaitre la structure en mémoire d'un String
Citation:
Envoyé par
edgarjacobs
Oui, ce qu'on appelle en C une chaîne de caractères (ou c-string) n'est rien d'autre qu'une suite d'octets contigus terminée par le caractère '\0' .
Bonjour Edgar Jacobs
Désolé de répéter ce qui est dans le titre :
j'aimerais connaitre la structure en mémoire d'un String
printf limite taille de string
Bonsoir
J'étais loin d'imaginer la façon dont était construit un String.
Je supposais une allocation mémoire mais avec seulement un indicateur de longueur et un pointeur.
En ce qui concerne le gaspillage de la mémoire c'est bien et que je pensais.
Cela me rappelle le bon vieux Basic interprété, sauf qu'alors il y avait une notion de 'garbage collection'
(un peu l'équivalent du defrag pour le système de fichier).
Pour l'instant :
1 j'ai pu résoudre mes problèmes.
2 j'ai appris quelque chose.
Que du positif!
J'aimerais, par curiosité, savoir ce qu'apportent
- l'utilisation de reserve() ainsi que
- l'utilisation d'un String avec indication de taille ( String machaine[12], par exemple)
Merci à tous les participants.
réponse lumineuse for bien documentée avec citation des références
@Jay M
Tout est dans le titre, il ne me reste plus qu'à changer mes habitudes.
Pour la correction de l'existant ça sera un long voyage pas tranquille.
MERCI pour vos réponses patientes et brillantes.