enregistrement des noms des fichiers dans un tableau [c] - C - Programmation
Marsh Posté le 24-05-2004 à 10:46:35
oui en effet je l'ai oublié. mais justement je pense que mon problème vient en partie du fait que je n'arrive pas à visualiser vraiment ce que je dois programmer pour garder en mémoire mon tableau de nom de fichier.
pour l'allocation mémoire j'ai mis :
NomTabFichier = (char *)malloc (NbrFichier * sizeof (char)) ;
or bien sur ça n'est pas correct.
je pense que le problème vient de la déclaration de mon tableau.
si j'ai bien compris j'ai déclaré un tableau de chaîne de caractère.
et je souhaite donc remplir chaque élément de ce tableau qui seront identifié par NomTabFichier[i] (c'est ça ?).
je sèche totallement sur le coup et je voudrais bien un peu d'aide.
Marsh Posté le 24-05-2004 à 11:16:39
avant de faire des strcpy quelque part, assure toi que la zone de destination est allouée et correctemet dimensionnée
Marsh Posté le 24-05-2004 à 11:34:22
j'ai édité le message pour mettre le code à jour. le problème est donc la déclaration de mon tableau.
est ce que je déclarre bien un tableau de chaine de caractere ?
parce que le malloc m'envoit boulet en me disant "incompatible types in assignment" ce qui tendrait donc à dire que c'est bien un tableau que j'ai déclaré. mais dans ce cas comment libérer de l'espace mémoire pour ce dernier ?
Marsh Posté le 24-05-2004 à 11:39:57
ton malloc est pas bon, et il manque toujours des allocations dans ta fonction
Marsh Posté le 24-05-2004 à 11:50:11
bah disons qu'avant de m'attaquer au reste je voudrais bien comprendre le début (c vraiment ça qui me bloque ensuite je trouverai par moi même je pense).
le problème de mon malloc c que là j'attribue la longueur pour une ligne du tableau (il faudrait d'ailleur que je change le nom de la variable c trompeur) mais pas pour tout le tableau (en même temps je voudrais faire quelque chose de dynamique).
ensuite mon tableau n'est pas correcte enfin j'ai pas trop l'impression. je voudrais un tableau du style :
---------------------------------
monfichier.mtv --> correspondant à NomTabFichier[0]
---------------------------------
essaie2.mtv --> correspondant à NomTabFichier[1]
---------------------------------
ada.mtv --> correspondant à NomTabFichier[2]
---------------------------------
or je crois pas du tout que c le cas.
ensuite je dois faire aussi à malloc dans ma fonction ParcoursFichier pour libérer de la mémoire ?
Marsh Posté le 24-05-2004 à 11:54:02
« ensuite je dois faire aussi à malloc dans ma fonction ParcoursFichier pour libérer de la mémoire ? »
oui, c'est tout à fait ça ...
Marsh Posté le 24-05-2004 à 12:04:52
bon voila j'ai remodifié le code mais j'ai tjrs le prb de mon "tableau" (si c vraiment un tableau d'ailleurs).
parce que je déclare un char* (ce qui correspond à une chaine de caractère). et je le fais "NbrFichier" (=100) fois. ce qui correspond donc à un tableau.
mais est ce que je pense bien comme le compilateur car j'ai un gros doute. j'ai pas l'impression que je déclare réellement un tableau de string mais plutot un string de longueur 100.
Marsh Posté le 24-05-2004 à 12:20:03
en consultant le man, je viens de voir que malloc retourne un pointeur vers le début du bloc.
or NomTabFichier n'est pas un pointeur mais un tableau de pointeur.
est ce qu'il faut que je crais un pointeur qui va pointer vers le début mon tableau ?
et ensuite j'utiliserai tout le temps ce pointeur pour accéder aux différents éléments.
j'aurais donc par exemple
pointeur = &(NomTabFichier[2]);
pointeur contiendra l'adresse de l'élément 2 c ça ? et pour voir le contenu ça sera :
*pointeur
je me trompe quelque part ?
merci d'avance
Marsh Posté le 24-05-2004 à 14:44:04
j'ai refait une partie du code avec une meilleure allocation de la mémoire (enfin je pense que c mieux).
Bon le problème c que c pire.
il plante lamentablement au niveau de
strcpy(temp,entree->d_name);
dans la fonction parcoursFichier au niveau de la boucle. une idée ? (je désespère un peu)
Marsh Posté le 24-05-2004 à 14:52:42
tu fais n'importe quoi .... t'as rien bité à rien, il te manque des allocations mémoires à des endroits, à d'autres tu en fais en écrasant tes paramètres ...
NomTabFichier[i] = malloc(LongueurNom * sizeof(char *))
la tu te plante
ensuite ton test if (TabFichier == NULL) t'es gentil fallait peut être le faire avant
tout ça tu peux le remplacer par
char tab[100][64]
Marsh Posté le 24-05-2004 à 15:00:49
normal, tu recopies entree-> machin dans un truc non alloué ...
Code :
|
puis là c'est sizeof char, pas sizeof char * je pense :
Code :
|
Marsh Posté le 24-05-2004 à 15:22:48
Houlala !!! t'as encore modifié des trucs mais ce n'est tjs pas bon !
soit tu déclares : char temp[64]; soit char *temp; et là tu fais un malloc, mais pas les 2 !!
ça doit pas compiler d'ailleurs ...
Et puis je ne pige pas ce que tu fais avec ton 2ème strtok ...
Marsh Posté le 24-05-2004 à 15:23:42
z'en avait pas marre de faire des malloc avec des tailles statiques ?
Marsh Posté le 24-05-2004 à 15:25:49
j'ai remodifié le programme (encore)...
bon ça va un peu mieux
à l'exécution j'obtiens ça :
nom complet : .
p apres premier decoupage : (null)
p avant comparaison : (null)
nom complet : ..
p apres premier decoupage : (null)
p avant comparaison : (null)
nom complet : VBroc16av.vit_f00007.mtv
p apres premier decoupage : VBroc16a
p avant comparaison : i
donc y'a un petit problème avec la fonction strtok. enfin je voudrais qu'il ne considère pas chaque lettre comme un séparateur mais que tout la chaine soit un séparateur.
Marsh Posté le 24-05-2004 à 15:28:52
bah euh c static pour l'instant mais après je le mettrai dans mon prog en mettant des variables après
le deuxième strtok permet de savoir euh... je crois que je sais plus pourquoi je l'ai fait ni même pk j'ai mis cette bétise. <--- va réfléchir à sa stupidité sur ce coup
Marsh Posté le 24-05-2004 à 15:31:14
si ça l'amuse ...
lordankou : faut éviter au maximum les allocations dynamiques, et ne les réserver qu'aux données dont la taille n'est pas connu à la compilation ou lorsqu'il y a redimensionnement, etc ...
Et puis c'est sources de bugs, faut vérifier que c'est alloué, puis ne pas oublier de désallouer, etc ..
Marsh Posté le 24-05-2004 à 15:56:51
bon voila modifié encore et encore... et ça marche presque (vais finir par être heureux à la fin de la journée).
alors tout d'abord je préfère le tableau dynamique pour deux raisons :
le premier est qu'étant donné je vais parcours un répertoire je ne connais pas à priori le nombre des fichier et la longueur des fichier (quoique cette dernière vais peut être la fixer). par conséquent je pense (mais j'y connais pas grand chose) que de cette manière je risque de perdre moins de place en mémoire
La deuxième raison c qu'avec mes profs plus y'a de place gagné et meilleur sera ma note de stage.
ensuite concernant la portion de code j'ai encore un problème de passage par paramètre. étant donné qu'on nous a beaucoup beaucoup apris ça (ironique) a vrai dire on y connait rien en C...
bref le problème c que là je fais un passage par valeur et que donc en retour dans mon main après l'exécution de ma fonction parcoursfichier bah j'ai un tableau vide alors que je le voudrais rempli (tout en évitant de mettre tout en variable global...).
Marsh Posté le 24-05-2004 à 16:13:38
pas bon : strcpy(TabFichier[0],entree->d_name);
c'est i l'index, et il faut l'initialiser à 0 avant le while.
Et si tu veux gagner de la place fait l'alloc dans ta boucle while uniquement si p != NULL
Et n'oublie pas la désallocation ..
Marsh Posté le 24-05-2004 à 16:25:04
en effet à force de faire des copier coller j'avais oublier de corriger. c fait lol de même que l'allocation dans la boucle pas bête ça !
par contre là je viens de me rendre compte d'un truc bizarre. dans le main juste après le parcours fichier il m'affiche pas le printf
Marsh Posté le 24-05-2004 à 16:29:04
utilise un tableau comme je t'ai dit, comme ça basta les allocations
Marsh Posté le 24-05-2004 à 16:34:53
TabFichier[i] = malloc(sizeof(entree->d_name));
pas sizeof mais strlen(entree->d_name) + 1 je pense
Marsh Posté le 24-05-2004 à 16:36:36
bah franchement je préférerais ne serait ce que pour la simplicité du code mais le problème c que déjà mon jury de stage je les supportent pas et vice versa alors si je fais en plus un truc pas optimisé aie aie aie
y'aura que ma tutrice qui me dira que c un bon boulot (tant que ça marche elle s'en fout).
euh sinon t'aurais une idée pour que à la sortie de mon parcoursfichier j'ai mes valeurs dans NomTabFichier ?
Marsh Posté le 24-05-2004 à 16:39:27
strlen va me retourner la longueur de la chaine tandis que sizeof va retourner directement la taille. comme ça si je dois changer de type de variables ça posera pas de prb
Marsh Posté le 24-05-2004 à 16:52:58
si tu passes &NomTabFichier, c'est donc un char *** dans ta fonction, il te faut alors travailler avec *NomTabFichier
Marsh Posté le 24-05-2004 à 16:55:16
dernier petit problème.
le printf("nom du fichier dans le tableau 2 : %s \n",NomTabFichier[0]);
juste après l'appel de parcourrepertoire fait stopper le programme mais sans aucun message d'erreur.
si je vire le [0] (un "peu" stupide) il m'arrête pas le programme (mais m'affiche des coeurs et tout ça ce qui est normal étant donné que ce n'est pas un 'caractère').
là j'avoue que je sèche (srutout qu'il n'y a aucun message d'erreur à la compilation ni à l'exécution)
Marsh Posté le 24-05-2004 à 17:12:52
hmm .. sizeof c'est la taille de la variable ...
donc gaffe car si c'est par example un char[] tu auras la taille de ton tableau de char, mais ta variable est char *, ça va te retourner probablement 4, mais en aucun cas la taille de ta chaine.
Marsh Posté le 24-05-2004 à 17:23:34
bon, j'ai fais un truc rapide, pas avec des fichiers mais de simples chaines de caractères :
Code :
|
Marsh Posté le 25-05-2004 à 09:33:08
mici ça marche niquel.
par contre j'ai une question.
pk mettre un char *** ?
parce que ça donne une pointeur sur un pointeur d'une chaine de caractêre
mais un pointeur sur une chaine de caractère ça aurait du suffir normalement non ?
a moins que l'on soit obligé pour le passage par référence du tableau. c'est à dire que le pointeur rajouté contient l'adresse du tableau que l'on passe à la fonction. ainsi on modifie bien le tableau et non juste une copie du tableau dont les valeurs seront perdus à la fin de la fonction. c'est bien ça ?
(N.B : j'ai mis le programme terminé en haut pour ceux que ça intéresse)
Marsh Posté le 25-05-2004 à 09:51:34
vi, Je pense, par contre ton free n'est pas suffisant, il faut également que tu libères les autres allocations, donc le mieux est d'initialiser ton tableau de pointeur à NULL, puis à la sortie tu fais une boucle qui scrute et libère tout ce qui est != NULL, et seulement après tu libère ton tableau de pointeur de char.
Marsh Posté le 25-05-2004 à 10:12:44
free libère l'espace pointé par le pointeur. donc si je fais free(NomTabFichier) je libère tout le tableau ou juste le pointeur pointant vers le tableau ?
Marsh Posté le 25-05-2004 à 10:39:35
free(NomTabFichier) libère bien le tableau de pointeur, mais pas les chaines de caractères que tu as mis, donc il faut commencer par là
Marsh Posté le 25-05-2004 à 10:44:48
Cricri_ a écrit : free(NomTabFichier) libère bien le tableau de pointeur |
ça j'attend encore de le voir
Marsh Posté le 25-05-2004 à 11:05:08
Ah ? tu m'inquiètes là ...
ben en debug ça n'a plus l'air de pointer sur une zône valide, donc je ne vois pas bien pourquoi ça ne fonctionne pas d'après toi ?
Marsh Posté le 25-05-2004 à 11:23:13
comment tu veux qu'il comprenne quelquechose si dans le même phrase tu emploies pointeur et tableau pour parler de la même chose ...
Marsh Posté le 24-05-2004 à 10:20:57
bon voila j'ai le code suivant (explication en dessous du code)
Voila je voudrais lister tous les noms de fichiers qui ont l'extension .mtv
Pour cela je veux les stocker dans un tableau afin de pouvoir les réutiliser plus tard (j'ai extrait le morceau de code ci dessus afin de régler en premier lieu ce problème de listage de fichier).
Lors de l'exécution il plante (pourtant il passe 3 fois dans la boucle --> il y a bien 3 fichiers dans le sous répertoire).
Je m'interroge donc sur ce plantage bien que j'ai de grosses lacunes au niveau pointeur (mais bon on va dire que la formation DUT info n'est pas top à ce niveau...).
Si quelqu'un a des idées je suis preneur.
N.B : je travail sous windows avec dev-c++
Message édité par lordankou le 26-05-2004 à 09:43:19
---------------