Je vais essayer de reprendre en rapide...
Une chaine de caracteres est un tableau de char.
Un tableau de char se declare comme ca char tableau[TAILLE]; avec TAILLE le nombre de caracteres a stocker (+1 pour la fin de chaine).
On peut faire autrement et plus dyamique mais c'est plus complique.
Un tableau de char, c'est aussi un pointeur. donc ecrire *tableau ou tableau[0] c'est pareil. Tout comme *(tableau+2) et tableau[2] sont aussi pareil.
Si je veux stocker "bonjour", j'ai besoin d'un tableau de 8 caracteres (7 lettres + fin de chaine \0). Ca fera
Maintenant pour strcat. La fonction se sert du caractere de fin de chaine pou savoir ou s'arreter. Si tu lui donnes une chaine sans, ca ne marche pas.
Il faut donc :
Lui donner en premier argument le pointeur vers une chaine de caractere (dans notre cas tableau)
Lui donner en deuxieme argument le pointeur vers la deuxieme chaine de caractere a concatener dans la premiere.
Dans cette ligne:
strcat(param[key],tmp);//concaténation
Tu lui donnes :
Un caractere en premier parametre. Ca ne peut pas marcher. Donne lui plutot juste param.
Un pointeur vers un tableau avec une seule case, qui ne possede donc pas de caractere de fin de chaine. Reprend l'exemple du tableau que j'ai donne dans des posts plus tot
Je sais pas si je suis totalement clair dans l'explication, ces histoires de pointeur c'est toujours un peu delicat a expliquer a l'ecrit...
Il faut inverser le 30 et le 5... en gros, le premier indique le nombre de sous array et le deuxieme la taille de ces derniers.
pour ton strcat...
essaie ca : strcat(¶m[key],tmp);
le & passera l'adresse plutot que la valeur...
pour le deuxieme argument ca devrait etre bon (mais il faut que tu sois sur que tmp[1] soit un caractere de fin de chaine
NAV
MIN
RED
A
*Circulaire
NAV
MIN
BLUE
B
*Defonceuse
NAV
MAX
ëPURPLE
C
alors :
les "*" sont mal placé, ça, j'ai compris la boulette, ça va être rectifier
il manque le dernier param, "ponceuse", je pense que c'est dû au fait que mon fixhier n'a pas de retour à la ligne à la fin, ça va se corriger aussi
par contre, le "ë" de "ëPURPLE", je le comprend pas...je détecte rien de particulier dans le fichier, ni dans le code qui pourrais généré ça..
et dernière question, quand on déclare tableau[5][30], les 30 représente l'espace total àlloué à la totalité de l'index principal, ou alloué à chaque sous-index ?
et dernière question, quand on déclare tableau[5][30], les 30 représente l'espace total àlloué à la totalité de l'index principal, ou alloué à chaque sous-index ?
Chaque chaine pourra faire 30 caracteres (29+1). Donc tu prends 30*5 = 150 octets en memoires pour ce tableau.
par contre, le "ë" de "ëPURPLE", je le comprend pas...je détecte rien de particulier dans le fichier, ni dans le code qui pourrais généré ça..o_O
C'est marrant moi j'aurais dit que c'etait le meme probleme que les * des autres mots... faudrait voir le code...
je devrais donc déclarer <tmp[1]="\0";> non ?
Tu mets des simples quotes a la place des doubles et c'est ca.
ok, je peut donc descendre à [15] pour l'array ! (y aurais moyen de définir la longueur de chaque index séparément (genre le premier fait 15, le second fait 1, ...)?)
pour ëPURPLE, j'ai plus ce soucie pour le moment, mais j'en ai un tout beau tout neuf à la place !
voici le code actuel ('tention les yeux ):
char path[30] = "";
char tmp[2] = " ";
char param[5][15]={{""},{""},{""},{""},{""}};
int key=0;
char loadMenu(char *fileName)
{sprintf(path, "Menu/%s.txt", fileName);
myFile = SD.open(path);
if(myFile)//si le fichier existe
{
while (myFile.available())//boucle tant qu'il y a du contenu
{
char car = myFile.read();//reception du char
switch (car)//gare de triage
{
case '|':
key++;//incrémentation du tableau
break;
case '\n':
Serial.println(param[0]);//lecture de param[0]
Serial.println(param[1]);//lecture de param[1]
Serial.println(param[2]);//lecture de param[2]
Serial.println(param[3]);//lecture de param[3]
Serial.println(param[4]);//lecture de param[4]
Serial.println('*');
break;
default:
tmp[0] = car;//pointeur
strcat(param[key],tmp);//concaténation
break;
}
}
myFile.close();//fermeture file
}
else
{
sprintf(path, "Le Menu %s est inaccessible !", fileName);//erreur de lecture
Serial.println(path);
}
}
et le résultat obtenu :
NAV
MIN
RED
A
Circulaire
*
NAV
MIN
RED
A
Circulaire
NAV
*
alors, 2 soucies :
sur les 3 lignes de mon fichier, je n'obtient que la première ligne et une copie de la première ligne
L'initialisation d'un tableau avec des accolades et autre n'est autorisée qu'à la déclaration de ce celui-ci.
Après, tu dois utiliser toutes les fonctions de manipulation ou des crochets.
// POSSIBLE (CAR DECLARATION) :
char param[5][15]={{""},{""},{""},{""},{""}};
// IMPOSSIBLE :
param[5][15]={{""},{""},{""},{""},{""}};
// POSSIBLE :
param[0][0] = '\0'; // Caractère fin de chaine en pos 0 => chaine vide
param[1][0] = '\0'; // Caractère fin de chaine en pos 0 => chaine vide
param[2][0] = '\0'; // Caractère fin de chaine en pos 0 => chaine vide
param[3][0] = '\0'; // Caractère fin de chaine en pos 0 => chaine vide
param[4][0] = '\0'; // Caractère fin de chaine en pos 0 => chaine vide
Tu peux aussi utiliser une petite boucle pour faire plus joli.
ou alors, tu écris dedans sans te soucier et tu y mets un caractère de fin de chaine au bon endroit... nettement plus crade, mais fonctionnel. et ça a l'avantage de pas prendre de temps pour remplir un tableau de 15*5 de 0...
EDIT j'avais mal lu ton post lorrio. j'avais cru que tu lui avais mis un truc du style de:
for (i=0;i<5;i++){ //dans chaque mot,
for (j=0,j<15,j++){ // pour chaque lettre
param[i][j]='0' //on met 0 comme caractere
}
}
c'est ça qui est vraiment chronophage et pas intéressant dans son cas
j'ai fait ma boucle et mtn, tout marche correctement !
(j'aurais aussi pu faire des bêtes copier-coller de tes premiers posts, mais je voulais trouver et comprendre se qui marche ou pas et pourquoi )
j'ai enfin mon lecteur de fichier opérationnelle !! mon(enfin, presque "mon") premier code qui marche sous Arduino !
bon, étape suivante, continuer la création de la lib qui transforme les param[] en bouton cliquable (presque opé), et gérer la navigation(là j'ai encore quelques gros doutes)...
dernier point pour essayer d'optimiser un peu :
dans l'initialisation du tableau, j'ai déclarer [15] car j'ai un index du tableau qui va s'approcher de ça, mais j'ai aussi des valeurs beaucoup plus petites, puis-je préciser la taille de chaque index, ou est-on forcer d'en donner qu'un seul, qui vaudra pour tout le tableau ?
Pour ce genre de tableau, tu es obligé de d'avoir une taille fixe pour tout le monde.
tab[5][15] est une suite continue de 5*15 octets, c'est en dure, tu ne peux pas changer.
D'ailleurs, si tu écris bat[0][16] = 'b';, ce qui est strictement interdit, ça va déborder sur la deuxième chaine du tableau et ça revient à écrire tab[1][2] = 'b';
Si tu veux des éléments variables, il te faut des chaines indépendantes, et un tableau de pointeurs les regroupant.
Cependant, chaque pointeur occupe 2 octets donc tu ne seras pas forcément gagnant.
je comprend, ce qui me gène c'est que seul un seul des index du tableau atteindra (au max) 14 octets, les autre tourne entre 2 et 4, faut que je fasse le calcul pour savoir quelle solution est la plus "rentable"
je l'avais noté ! mon tab4[2] ne contient par exemple qu'un seul caractère (mais t'a eu raison de me le répéter encore une fois cela dit, ça fera au moins une notion d'intégré dans ma mémoire )
Merci beaucoup c'étais vraiment un truc bête, j'aurais jamais cru que ce genre d’erreur puisse provoquer ce genre de réaction, du coup, je cherchais pas du tout dans cette direction !
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
oui. non. enfin je regarde et je te dis.