Appel au pros du Malloc [erreur etrange]

Signaler
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004
-
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
Bonjour,

j'aimerai lister le contenu d'un repertoire dans un tableau de char. Mon pb, c'est que lorsque je le fais, j'ai mon tableau qui ne se rempli pas correctement. Pour le premier fichier, il met le nom du premier fichier dans la premier ligne du tableau, pour le second nom de fichier, il le met sur la 1er et la 2e, et ainsi de suite. Ce qui fait, qu'a la fin, j'ai que le nom du dernier fichier en autant de fois dans le tableau qu'il y a de fichier total.

Voila mon code, j'avais essaye aussi les listes chainees, j'ai eu le meme pb, je pensais que ca venaient de code, mais en fait non, voila le dernier code, c'est une methode pourtant classique et sans complexite, mais ca fonctionne pas. Je vois pas d'ou vient l'erreur. Peut-etre vient-elle du mallocage. J'ai vraiment tout fait d'une methode la plus simple possible pour voir ou est l'erreur, mais rien.

WIN32_FIND_DATA Fichier;
HANDLE Search;

int Get_Number_File_In_Directory()
{
WIN32_FIND_DATA Fich;
HANDLE Seek;
int nbfile=0;

Seek = FindFirstFile("*.*", &Fich);

if (Seek != INVALID_HANDLE_VALUE)
{
nbfile = nbfile + 1;

while (FindNextFile(Seek, &Fich))
{
nbfile = nbfile + 1;
}
}

return nbfile-1;
}

void main()
{int i, nbfile 0, Etage 0;
char **List;

nbfile = Get_Number_File_In_Directory();

List = malloc((nbfile) * sizeof(unsigned char **));

Search = FindFirstFile("*.*", &Fichier);

if (Search != INVALID_HANDLE_VALUE)
{
ListMP3.The_List[Etage] = Fichier.cFileName;

while (FindNextFile(Search, &Fichier))
{
Etage = Etage + 1;
ListMP3.The_List[Etage] = Fichier.cFileName;
}

}

FindClose(Search);

printf("\n");

for (i=0; i<=nbfile; i = i +1)
{
printf("%s\n", ListMP3.The_List[i]);
}

printf("\n");
return;
}

Merci a tous ceux qui vont m'aider.

10 réponses

Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Le code n'est pas bon, j'ai laisse mes strutures un peu par tout. Desole, le revoila !

WIN32_FIND_DATA Fichier;
HANDLE Search;

int Get_Number_File_In_Directory()
{
WIN32_FIND_DATA Fich;
HANDLE Seek;
int nbfile=0;

Seek = FindFirstFile("*.*", &Fich);

if (Seek != INVALID_HANDLE_VALUE)
{
nbfile = nbfile + 1;

while (FindNextFile(Seek, &Fich))
{
nbfile = nbfile + 1;
}
}

return nbfile-1;
}

void main()
{int i, nbfile 0, Etage 0;
char **List;

nbfile = Get_Number_File_In_Directory();

List = malloc((nbfile) * sizeof(unsigned char **));

Search = FindFirstFile("*.*", &Fichier);

if (Search != INVALID_HANDLE_VALUE)
{
List[Etage] = Fichier.cFileName;

while (FindNextFile(Search, &Fichier))
{
Etage = Etage + 1;
ListEtage] = Fichier.cFileName;
}

}

FindClose(Search);

printf("\n");

for (i=0; i<=nbfile; i = i +1)
{
printf("%s\n", ListMP3.The_List[i]);
}

printf("\n");
return;
}
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Essaye de remplacer

Etage = Etage + 1;

par

Etage += strlen(Fichier.cFileName) + 1;
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Bah ca regle pas mon pb en fait, j'ai pas d'erreur lors de la compilation, ni lors de l'affichage de ce que j'ai stocke dans List[], mais j'ai des erreurs lorsque je veux afficher tout le contenu de List.

Sais tu comment faire pour que je puisse voir le contenu de ce que j'ai enregistrer en ayant fait la modif que tu m'as conseille ?
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Ah oui, faut peut-être aussi que tu remplaces

List[Etage] = Fichier.cFileName;

par

strcpy(List[Etage], Fichier.cFileName);

Tu peux toujours ce que cela donne avec un debogueur
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Le prog plante lorsque je fais le remplacement que tu m'as dit. Ca m'ernerve de ne pas trouver. J'arrete pas de chercher, de le faire sur papier et je trouve pas l'erreur.
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

J'oubliais .... Tu as alloué de la mémoire pour un tableau de pointeurs char* et pour chaque élément du tableau, il faut ré-allouer de la mémoire pour y copier la chaine.

Exemple:

char **tabStr;
tabStr=new char *[10];
tabStr[0]=new char [X];
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Je met ca apres mon malloc, et juste avant que je fasse le strcpy ?
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

Le new ne passe pas, le compilateur me dit qu'il ne le reconnait pas. En plus jamais utilise moi new. Faut une lib special ?
Messages postés
137
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
30 septembre 2004

ok, c'est bon je viens de comprendre, et maintenant ca tourne impec, j'avais pas effectivement etabli les ligne du tab. maintenant je fais ca :

Grand merci Kaid, c'est super simpa !

List = malloc((nbfile) * sizeof(unsigned char **));

Search = FindFirstFile("*.*", &Fichier);

if (Search != INVALID_HANDLE_VALUE)
{
List[Etage] = malloc(strlen(Fichier.cFileName) * sizeof (char *));
strcpy(List[Etage], Fichier.cFileName);

while (FindNextFile(Search, &Fichier))
{
Etage = Etage + 1;
List[Etage] = malloc(strlen(Fichier.cFileName) * sizeof (char *));
strcpy(List[Etage], Fichier.cFileName);
}

}

FindClose(Search);

printf("\n");

for (i=nbfile; i>=0; i--)
{
printf("%s\n", List[i]);
}
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Oui, juste avant le strpcy(). new c'est du C++ et pas du C, excuse-moi, utilise malloc().