En fait ça fonctionne très bien. Beaucoup d'erreur ont été commise au niveau tableau. ![]()
La confusion entre un tableau de char ou x valait le nombre de possibilités et un tableau à deux dimensions qui lui a un nombre de possibilité de case contenant un nombre de caractères données.
L'incompréhension de strncpy qui après coup est effectivement une fonction rapide et pratique.
Je met ici la solution finale qui fonctionne.
#define SIZE_BUFFER 32 //Nombre de case du buffer
#define SIZE_CMDE 10 //Nombre de commandes
File myFile; //Fichier
String tblFicMdle[SIZE_CMDE]; //Le tableau des noms des fichiers modèles
String tblFicSvg[SIZE_CMDE]; //Le tableau des noms des fichiers de sauvegardes
int nbFichierMdle; //Nombre de fichier
char tblConfSvg[SIZE_CMDE][SIZE_BUFFER]; //Le tableau des configuration du fichier de sauvegarde
char tblConfMdle[SIZE_CMDE][SIZE_BUFFER]; //Le tableau des configurations du fichier de modèle
/* SETUP */
void setup() {
//Initialiser la carte SD
if(initSD()) {
//Lister les fichier de sauvegardes
listeFichier("/svgde/");
//Lister les fichiers de configuration modèle
nbFichierMdle = listeFichier("/modeles/");
//Ouvrir le fichier de sauvegarde
//ouvrirFichier("/svgde/", tblFicSvg[0]);
ouvrirFichier("/modeles/", tblFicMdle[2]);
}
else {
//Charger les valeurs par défaut de la radio
}
Serial.println(tblConfMdle[0]);
Serial.println(tblConfMdle[1]);
Serial.println(tblConfMdle[2]);
Serial.println(tblConfMdle[3]);
Serial.println(tblConfMdle[4]);
}
/* LOOP */
void loop() {
}
/* FONCTION listerFichier() */
int listeFichier(String chemin) {
int count = 0;
char path[SIZE_BUFFER];
//Conversion du chemin
chemin.toCharArray(path, SIZE_BUFFER);
//Ouvre ce qui est défini par le chemin
myFile = SD.open(path);
//Tant que c'est vrai
while(true) {
//Prend le nom du fichier
File entry = myFile.openNextFile();
//Si c'est la fin
if(!entry) {
break; //Sortir de la boucle
}
//Si le nombre de fichier est plus important que le nombre de place en tableau
if(count == SIZE_CMDE) {
break; //Sortir de la boucle
}
//Si c'est le répertoire /modeles/
if(chemin == "/modeles/") {
//Rentre le nom de fichier dans le tableau des noms de modèles
tblFicMdle[count] = entry.name();
}
//Si c'est le répertoire /sauvegarde/
if(chemin == "/svgde/") {
//Rentre le nom de fichier dans le tableau des noms de sauvegarde
tblFicSvg[count] = entry.name();
}
count++; //Compter le nombre de fichier
}
//Fermer le fichier
myFile.close();
//Retourner le nombre de fichier
return count;
}
/* FONCTION qui ouvre un fichier */
void ouvrirFichier(String rep, String fic) {
//Variables
char path[SIZE_BUFFER], bufferConf[SIZE_BUFFER+1];
int i, bufferLenght, lineCounter = 0;
String chemin;
clearLcd(); //Efface l'écran
ecrireLcd("Fichier en lecture", 01); //Ecrire
//Crée le chemin
chemin = rep + fic;
//Transforme le chemin
chemin.toCharArray(path, SIZE_BUFFER);
//Ouvre le fichier
myFile = SD.open(path, FILE_READ);
//Si le fichier est présent
if(myFile) {
//Tant que ce n'est pas la fin du fichier
while(myFile.available()) {
//Récupère la ligne
i = 0;
while((bufferConf[i++] = myFile.read()) != '\n') {
//Si la ligne dépasse le buffer
if(i == SIZE_BUFFER) {
break;
}
}
bufferLenght = i; //Garder en mémoire le nombre de lettre
bufferConf[--i] = '\0'; //Finir la ligne en retirant le saut de ligne
//Ne pas enregistrer les lignes vides ou les commentaires
if(bufferConf[0] == '\0' || bufferConf[0] == '/' || bufferConf[0] == '#') {
continue;
}
//Charger le tableau des configurations modèle
if(rep == "/modeles/") {
/*
Copie le tableau contenant une commande, dans le tableau
à deux dimensions qui est extérieur
*/
strncpy(tblConfMdle[lineCounter], bufferConf, SIZE_BUFFER);
bufferConf[SIZE_BUFFER] = '\0'; //Fini par un '\0'
}
//Charger le tableau des configurations sauvegardes
if(rep == "/svgde/") {
/*
Copie le tableau contenant une commande, dans le tableau
à deux dimensions qui est extérieur
*/
strncpy(tblConfSvg[lineCounter], bufferConf, SIZE_BUFFER);
bufferConf[SIZE_BUFFER] = '\0'; //Fini par un '\0'
}
lineCounter++; //Compter le nombre de lignes
}
//Fermer le fichier
myFile.close();
}
return;
}
La prochaine étape va être de pouvoir charger les variables de tests. Avant je faisait des tests sur des strings. N'aurais-je pas intérêt à faire des tests sur des char fonction1, fonction2, fonction3... chargée par fonction1 = tbl1[0]; ... ?
Dans mon tableau j'ai entre autre du boolean (true ou false) qui doivent au final être tester. Je comprends bien qu'il me faudra faire de nouvelles conversions.