Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2587 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

[c] enregistrement des noms des fichiers dans un tableau

n°737399
Taz
bisounours-codeur
Posté le 25-05-2004 à 11:23:13  profilanswer
 

Reprise du message précédent :
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 ...

mood
Publicité
Posté le 25-05-2004 à 11:23:13  profilanswer
 

n°737401
cricri_
Posté le 25-05-2004 à 11:25:24  profilanswer
 

Exact ..

n°737412
lordankou
Posté le 25-05-2004 à 11:30:35  profilanswer
 

donc pour résumer il faut que je fasse un malloc à l'envers, c'est à dire utiliser le free pour libérer les char * contenant le nom de mes fichier et ensuite libérer les pointeurs vers les char *.
Sinon j'au un autre problème. j'ai inclu la fonction dans mon programme principale et là au surprise bah ça marche pas. en fait il plante dans le parcoursFichier mais sans aucun message d'erreur. bizarre non ?


---------------

n°737429
cricri_
Posté le 25-05-2004 à 11:42:57  profilanswer
 

on peut voir ce code ?

n°737447
Taz
bisounours-codeur
Posté le 25-05-2004 à 11:51:23  profilanswer
 

et la solution du tableau de tableaux, elle plait vraiment pas

n°737456
lordankou
Posté le 25-05-2004 à 11:58:50  profilanswer
 

voila une partie du code (la fonction parcoursFichier c la même que précédemment)
 

Code :
  1. // parcours repertoire
  2. // cette fonction va parcourir le répertoire test et récup tous les fichiers mtv
  3. void ParcoursFichier(int , char*** );
  4. // ----------------------------
  5. // Corps du programme principal
  6. // ----------------------------
  7. int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
  8. {
  9.     // Declaration des variables
  10.     // Variables OpenGl
  11.     WNDCLASS wc;
  12.     HWND hWnd; // handle de la fenetre (identifiant)
  13.     HDC hDC; // device context  
  14.     HGLRC hRC; // context de rendu     
  15.     MSG msg;
  16.     BOOL bQuit = FALSE;
  17.     float theta = 0.0f;
  18.     // variable gestion Fichier
  19.     char *NomFichier = "VBroc16av.vit_f00007.mtv"; // nom du fichier MTV contenant les vitesses des courants
  20.     char **NomTabFichier; // tableau contenant le nom des fichiers  
  21.  
  22.     // parcours repertoire
  23.     // on va parcourir le répertoire et récupérer tous les noms
  24.     ParcoursFichier(100 , &NomTabFichier );
  25.  
  26.    // Gestion des fichiers
  27.    // gestion du fichier vitesse de courant
  28.    GestionFichier(NomFichier);     
  29. ...


 
bon le problème c quand je mes la fonction  
ParcoursFichier(100, &NomTabFichier );
il s'arrête juste après  
quand je la mes en commentaire il m'exécute normalement le programme.
ça ressemble au problème évoqué précédemment quand je voulais accéder à un élément du tableau qui n'existait pas. or là il existe puisqu'on utilise la même fonction qu'avant et que cette dernière marche.
 
Taz qu'entends tu par la solution de tableau de tableau ? c'est le tableau statique dont tu m'as parlé précédemment ?


---------------

n°737463
Taz
bisounours-codeur
Posté le 25-05-2004 à 12:00:44  profilanswer
 

oui tab[100][64]

n°737478
lordankou
Posté le 25-05-2004 à 12:07:42  profilanswer
 

honnétement je préférerais largement aussi mais le problème c mon jury qui va à tous les coups me faire le reproche que prends trop de place. ce qui n'est pas totalement faux car bon il est possible d'avoir des centaines de fichier.
mais c sur que ça serait bcp moins d'embrouille et de risque d'erreurs (surtout vu mon niveau)


---------------

n°737496
lordankou
Posté le 25-05-2004 à 12:17:40  profilanswer
 

l'erreur provient bien de mes pointeurs. puisqu'avec un tableau statique comme tu le suggère ça passe niquel.  
au moins je sais d'ou vient l'erreur. bah du moins ou elle se situe envirron. vais vérifer l'attribution des espaces mémoires sur mes pointeurs je pense que ça vient de là
<--- repart dans une phase intense de test


---------------

n°737580
Taz
bisounours-codeur
Posté le 25-05-2004 à 13:10:04  profilanswer
 

ben alors pourquoi tu écris en dur "100" et "64" alors que ton truc est dynamique ?

mood
Publicité
Posté le 25-05-2004 à 13:10:04  profilanswer
 

n°737585
cricri_
Posté le 25-05-2004 à 13:14:39  profilanswer
 

Mais ça fait quoi exactement ?
Et puis blinde la boucle interne en testant :
while ( Nom[i] != NULL && i < NombreLigne) {

n°737593
lordankou
Posté le 25-05-2004 à 13:19:55  profilanswer
 

Citation :


ben alors pourquoi tu écris en dur "100" et "64" alors que ton truc est dynamique ?  


 
bah c'était juste pour le test. 100 parce que euh je sais pas et 64 c le numéro de mon département.  
pour l'erreur j'ai un peu près trouvé. c'est un strtof qui pose problème enfin un des paramètres. vais corriger ça


---------------

n°737619
Taz
bisounours-codeur
Posté le 25-05-2004 à 13:42:49  profilanswer
 

et merde un bayonnais

n°737669
lordankou
Posté le 25-05-2004 à 14:07:12  profilanswer
 

Taz a écrit :

et merde un bayonnais


 
et non juste pour les études sinon je suis breton (de Brest). lol c pas mieux remarque.


---------------

n°737771
lordankou
Posté le 25-05-2004 à 14:37:59  profilanswer
 

euh j'ai encore un erreur à la con mais qui m'exaspère.
j'ai deux fonction qui marche niquel quand elles sont utilisés indépendemment l'une de l'autre, c'est à dire que j'exécute mon prg avec une et l'autre et en commentaire et ça marche.  
ors j'ai besoin des deux. ce qui est encore plus bizarre c que les deux fonctions n'utilisent même pas de paramètre commun.
et en plus aucune erreur ni warning à la compilation et à l'éxécution ce n'est pas mieux (aucun message il arrête juste le programme après l'éxécution des fonctions comme si tout c'était bien passé)


---------------

n°737832
cricri_
Posté le 25-05-2004 à 14:57:23  profilanswer
 

vi, mais tu sais, sans voir le code ...

n°737886
thermoclin​e
Geek intelligent
Posté le 25-05-2004 à 15:22:51  profilanswer
 

Meme sans voir le code, ca sent la variable qui devrait etre declaree en locale dans les 2 fonctions et qui se retrouve en globale (et donc probablement mal initialisee).

n°737942
lordankou
Posté le 25-05-2004 à 15:46:48  profilanswer
 

après une légère vérification si il n'y avait pas de variable locale en global (y'en avait pas c rassurant) voila le code :  
 

Code :
  1. // ----------------------------
  2. // Corps du programme principal
  3. // ----------------------------
  4. int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow)
  5. {
  6.     // Declaration des variables
  7.     // Variables OpenGl
  8.     WNDCLASS wc;
  9.     HWND hWnd; // handle de la fenetre (identifiant)
  10.     HDC hDC; // device context  
  11.     HGLRC hRC; // context de rendu     
  12.     MSG msg;
  13.     BOOL bQuit = FALSE;
  14.     float theta = 0.0f;
  15.     // variable gestion Fichier
  16.     char *NomFichierSource = "VBroc16av.vit_f00007.mtv"; // nom du fichier MTV contenant les vitesses des courants
  17.     char **NomTabFichier; // tableau contenant le nom des fichiers  
  18.  
  19.     // parcours repertoire
  20.     // on va parcourir le répertoire et récupérer tous les noms
  21.     ParcoursFichier(100 , &NomTabFichier );
  22.  
  23.    // Gestion des fichiers
  24.    // gestion du fichier vitesse de courant
  25.    GestionFichier(NomFichierSource);          
  26. // Gestion Fichier
  27. // cette fonction va gérer tous les fichiers sources contenant les vecteurs vitesses
  28. void GestionFichier(char* NomFichier){
  29.    // déclaration des variables
  30.    FILE *nomFichierVintMTV; // identifiant du fichier MTV contenant les vitesses des courants
  31.    // ouverture d'un fichier
  32.    nomFichierVintMTV = ouvertureFichier(NomFichier);
  33.    // traitement du fichier
  34.    traitementFichier(nomFichierVintMTV);
  35.    // fermeture du fichier
  36.    fermerFichier(nomFichierVintMTV); 
  37. }
  38. // ouverture d'un fichier
  39. // cette fonction va ouvrir en lecture le fichier passer en parametre
  40. FILE *  ouvertureFichier(char * nom){
  41.   FILE * IdentifiantFIchier ;
  42.   // on ouvre le fichier en mode lecture
  43.   if ((IdentifiantFIchier = fopen(nom, "r" )) == NULL)
  44.   {
  45.     printf ("can't open file : %s, file not exist", nom);
  46.     exit(0);
  47.   }
  48. };
  49. // traitement du fichier
  50. // cette fonction va traiter le fichier passer en parametre
  51. void traitementFichier(FILE *fichierTraiter){
  52. char ligne[255]; // taille d'une ligne
  53. int j ; // variable pour le parcours des colonnes
  54. int i = 0 ; // variable pour les ligne de donnees
  55. int varParcours ; // variable pour le parcours du tableau de vecteurs
  56. int col ; // variable pour le parcours des colonnes du tableau de vecteurs.
  57. char* mot; // coordonnees sous forme de chaine de caractère  
  58. char* separateurEspace = " "; // separateur pour les colonnes
  59.   // lecture des 9 premieres lignes pour afficher les caractéristiques
  60.   for (i=0; i<9; i++){
  61.     // lecture d'une ligne
  62.     fgets(ligne, 255, fichierTraiter);
  63.   }
  64.   // on remet i à 0
  65.   i=0;
  66.   // lecture des coordonnées de chaque vecteurs  
  67.   while (fgets(ligne,255, fichierTraiter) != NULL){
  68.     // on va decouper la ligne selon les espaces
  69.     // on decoupe le premier mot -> on recupere X
  70.     mot = strtok(ligne, separateurEspace);
  71.     // on decoupe la ligne selon les espaces -> on recupere Y,Z, Vx,Vy,Vz
  72.     for (j=0; j<6; j++){
  73.       // on enregistre la coordonnes dans un tableau
  74.      
  75.       tabCoordonnees[i][j] = atof(mot);
  76.       mot = strtok(NULL,separateurEspace);
  77.     }
  78.     // on incrémente le nombre de ligne parcouru
  79.     i++;
  80.   }
  81.   // initialisation des extremes
  82.   maxX = tabCoordonnees[j][0];
  83.   minX = tabCoordonnees[j][0];
  84.   maxY = tabCoordonnees[j][1];
  85.   minY = tabCoordonnees[j][1];
  86.   maxZ = tabCoordonnees[j][2];
  87.   minZ = tabCoordonnees[j][2];
  88.  
  89.   // recherche des 6 points extremes : maxX,minX,maxY,minY,maxZ,minZ.
  90.   // parcours des i lignes du tableau
  91.   for (j=0; j<i; j++){
  92.  
  93.     // recherche du maxX
  94.     if (tabCoordonnees[j][0]>maxX){ 
  95.         maxX = tabCoordonnees[j][0] ;
  96.     }   
  97.    
  98.     // recherche du minX
  99.     if (tabCoordonnees[j][0]<minX){
  100.         minX = tabCoordonnees[j][0] ;
  101.     } 
  102.    
  103.     // recherche du maxY
  104.     if (tabCoordonnees[j][1]>maxY){
  105.         maxY=tabCoordonnees[j][1] ;
  106.     } 
  107.    
  108.     // recherche du minY
  109.     if (tabCoordonnees[j][1]<minY){
  110.         minY=tabCoordonnees[j][1] ;
  111.     } 
  112.    
  113.     // recherche du maxZ
  114.     if (tabCoordonnees[j][2]>maxZ){
  115.         maxZ=tabCoordonnees[j][2] ;
  116.     } 
  117.    
  118.     // recherche du minZ
  119.     if (tabCoordonnees[j][2]<minZ){
  120.         minZ=tabCoordonnees[j][2] ;
  121.     } 
  122.   }
  123.   // determination de la difference des extremes
  124.   diffX = maxX - minX; // diff des X
  125.   diffY = maxY - minY; // diff des Y
  126.   diffZ = maxZ - minZ; // diff des Z
  127.   // definition des echelles
  128.   echelleX = 2/diffX;
  129.   echelleY = 2/diffY;
  130.   echelleZ = 2/diffZ;
  131.   nbrligne=i;
  132. };
  133. // fermeture du fichier
  134. // cette fonction va fermer le fichier passé en parametre
  135. void fermerFichier(FILE *fichierFermer){
  136.   // fermeture du fichier
  137.   fclose(fichierFermer);
  138. };
  139. // parcours repertoire
  140. // cette fonction va parcourir le répertoire test et récup tous les fichiers mtv
  141. void ParcoursFichier(int NombreLigne, char*** TabFichier){
  142.     // declaration des variables
  143.     DIR * repertoire ; // definition d'une variable de type Repertoire
  144.     char * NomRep = "TEST" ; // Nom du répertoire test
  145.     struct dirent *entree ; //une entree du repertoire  
  146.     char * separateur = ".mtv" ; // type de fichier recherché
  147.    
  148.     char *p ; // variable temporaire
  149.     int iParcours = 0; // variable temporaire
  150.     // allocation de la mémoire pour la variable NomTabFichier
  151.     *TabFichier = (char **) malloc(NombreLigne * sizeof(char *)); // char ** pour la conversion du pointeur renvoyé par malloc
  152.     //vérification de l'allocation  
  153.     if (TabFichier == NULL)
  154.     { 
  155.         printf ("l'allocationde la mémoire a échoué. Fin du programme \n" ) ; 
  156.         exit (0) ;                         
  157.     }
  158.     //ouverture du répertoire
  159.     repertoire = opendir(NomRep);
  160.     // parcours du répertoire
  161.     while((entree=readdir(repertoire))!=NULL)
  162.     {
  163.         // on verifie si elle contient la sous chaine ".mtv"
  164.         p = strstr(entree->d_name,separateur);
  165.         if (p!=NULL)
  166.         {         
  167.        
  168.           // allocation de l'espace memoire       
  169.           (*TabFichier)[iParcours] = (char *)malloc(sizeof(entree->d_name));
  170.          
  171.           // copie du nom du répertoire
  172.           strcpy((*TabFichier)[iParcours],entree->d_name);
  173.        
  174.           // on incremente la variable iParcours  
  175.           iParcours++ ;
  176.          
  177.         } 
  178.     }
  179.    
  180.     // on ferme le répertoire
  181.     closedir(repertoire);
  182. }


 
les deux fonction en gras en haut pose problème. quand les deux sont activé en même ça "plante" mais sans message d'erreur. si je mes l'une ou l'autre en commentaire c bon ça plante pas mais bon j'ai besoin des deux.
Sinon dans la fonction gestionfichier l'erreur se produit quand j'essaie d'ouvrir le fichier (il existe bien j'ai les droits dessus). ou alors si j'effectue tout opération sur le pointeur de fichier il plante.
dans parcoursfichier l'erreur se situe à ce niveau ci :  
 
 

Code :
  1. strcpy((*TabFichier)[iParcours],entree->d_name);


 
N.B : le code n'est pas du tout terminé et il faut que je remplace les tableaux statiques par des tableaux dynamique (mais bon plus tard quand ça marchera).


Message édité par lordankou le 25-05-2004 à 15:52:51

---------------

n°738080
lordankou
Posté le 25-05-2004 à 16:52:10  profilanswer
 

j'ai fait une inversion des deux procédure posant problème en mettant en premier gestionfichier et ensuite parcourfichier et là au miracle ça marche.
sauf que parcourfichier doit me donner le nom du fichier à gérer dans gestionFichier.  
Je me pose donc la question suivante : l'attribution de mémoire à mon "tableau" contenant les noms de fichiers empêche t'elle de pouvoir utiliser un autre pointeur dans une autre fonction ?  
ou alors est ce que le pointeur de fichier n'essaie pas d'écrire dans un emplacement réservé à mon tableau de fichier ? mais dans ce cas comment faire pourqu'il n'y touche pas ?


---------------

n°738138
thermoclin​e
Geek intelligent
Posté le 25-05-2004 à 17:31:59  profilanswer
 

Pour le gestionfichier, ton erreur est normal: tu ne fais pas le return dans ta fonction d'ouverture...  
 
Dans parcoursfichier, tu ne fais aucun free apres avoir fais tes malloc, je ne comprends pas ton triple pointeur de char en parametre et il y a surement d'autre trucs mais rien qui n'explique une "interference" entre les 2 modules.
Pour moi il est impossible qu'ils marchent, meme tout seul...


Message édité par thermocline le 26-05-2004 à 03:42:18
n°738982
lordankou
Posté le 26-05-2004 à 09:03:41  profilanswer
 

thermocline a écrit :

Pour le gestionfichier, ton erreur est normal: tu ne fais pas le return dans ta fonction d'ouverture...  
 
Dans parcoursfichier, tu ne fais aucun free apres avoir fais tes malloc, je ne comprends pas ton triple pointeur de char en parametre et il y a surement d'autre trucs mais rien qui n'explique une "interference" entre les 2 modules.
Pour moi il est impossible qu'ils marchent, meme tout seul...


 
pour l'ouverture en effet un petit return oublier du à quelques manipulation à droite et à gauche pour corriger une autre erreur.
malgrés ce changement ça marche pas.
ensuite je ne fais pas de free directement après parcourfichier car j'utilise la variable dans une autre fonction (ce qui explique le triple pointeur puisque je passe par référence mon "tableau" d'origine à la fonction).
et bah si ça marche bien tout seul. j'ai testé et retesté et tout marche niquel tout seul ou en mettant gestionfichier avant parcoursfichier
Mais est ce que le fait de ne pas libérer la mémoire tout de suite mais à la fin du programme pourrait faire planter le pointeur de fichier (car à priori c là que ça plante pour la gestion de fichier) car il essaierai d'écrire dans un emplacement réservé du tableau ?


---------------

n°739474
lordankou
Posté le 26-05-2004 à 11:37:40  profilanswer
 

le problème venait de l'allocation de la mémoire pour chaque ligne
en mettant
(*TabFichier)[iParcours] = (char *)malloc(strlen(entree->d_name)+1);
à la place de :
(*TabFichier)[iParcours] = (char *)malloc(sizeof(entree->d_name));
ça marche. ce qui a vrai dire semble logique puisque sizeof ne retourne pas la longueur de la chaine mais le pointeur vers cette chaine (qui n'ont donc pas la même taille). c ça au moins ? (que je dise pas de bétise)


---------------

n°739501
cricri_
Posté le 26-05-2004 à 11:43:42  profilanswer
 

vi, et c'est bien ce que j'avais écrit ... ;)

n°739674
Joel F
Real men use unique_ptr
Posté le 26-05-2004 à 13:11:21  profilanswer
 

Taz a écrit :

et merde un bayonnais


 
oauis faut le bayonner !
 
 
 
---->[]

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
une table de 325000 enregistrementEnregistrement successifs dasn Access VB
Access compter les enregistrementlien pour ouvrir des fichiers .PDF
Petit problème avec un transfert de tableauecrire un tableau dans un fichier
[Access] Positionner un formulaire sur un enregistrement ...[Résolu]Liste de fichiers
Extends un tableau basique, c'est impossible ?probleme upload de fichiers
Plus de sujets relatifs à : [c] enregistrement des noms des fichiers dans un tableau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR