IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Liste chainée


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Par défaut Liste chainée
    j'ai un problème avec la création d'une liste chainée

    voila le probleme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct listeplaylist {
    	char *chemin;
    	struct listeplaylist *psuiv;
    };
     
    struct listeplaylist *pdeb;
    struct listeplaylist pcour;
    char info[];
     
    strcpy(pcour.chemin,dosscour);
    pcour.psuiv=pdeb;
    pdeb=&pcour;
    si quelqu'un pouvais me dire où était mon erreur, ca serait gentil
    joyeuse paques !!

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: Liste chainée
    Citation Envoyé par LLaval
    j'ai un problème avec la création d'une liste chainée
    Ton code est incomplet.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    Project   : OP code
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\OP\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c:12: error: syntax error before '.' token
    main.c:12: warning: type defaults to `int' in declaration of `strcpy'
    main.c:12: warning: function declaration isn't a prototype
    main.c:12: warning: conflicting types for built-in function 'strcpy'
    main.c:12: warning: data definition has no type or storage class
    main.c:13: error: syntax error before '.' token
    main.c:14: warning: type defaults to `int' in declaration of `pdeb'
    main.c:14: error: conflicting types for 'pdeb'
    main.c:8: error: previous declaration of 'pdeb' was here
    main.c:14: warning: initialization makes integer from pointer without a cast
    main.c:14: warning: data definition has no type or storage class
    main.c:10: warning: array 'info' assumed to have one element
    Process terminated with status 1 (0 minutes, 0 seconds)
    Merci de poster un code complet et réduit au minimum montrant le défaut.

    Merci d'indiquer aussi quel est le défaut, parce que "j'ai un problème", c'est pas très précis...

  3. #3
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Tu n'a pas alloué d'espace pour le champs chemin de ta structure.

  4. #4
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut Re: Liste chainée
    Citation Envoyé par LLaval
    strcpy(pcour.chemin,dosscour);

    si quelqu'un pouvais me dire où était mon erreur, ca serait gentil
    joyeuse paques !!
    Pour compléter skyrunner
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  5. #5
    Membre éprouvé Avatar de ccensam
    Inscrit en
    Juillet 2005
    Messages
    128
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Juillet 2005
    Messages : 128
    Par défaut voila
    Tu dois allouer l'espace mémoir pour tes variables et réviser ton cour de listes chainées et ton cours sur les pointeurs.
    Voila un bon début :
    http://chgi.developpez.com/pointeur/
    http://chgi.developpez.com/pile/
    http://nicolasj.developpez.com/articles/listesimple/
    http://nicolasj.developpez.com/articles/listedouble/
    et bonne lecture. Et n'oublie pas surtout pas de mettre

  6. #6
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Par défaut
    pour plus de clareté, voila ce que je voulais faire :

    le but du programme est de parcourir l'arborescence, de trouver certains fichiers et de conserver leur chemin dans un but ultérieur.

    le type des éléments de la liste est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct infotag
     {
      char *fichier;
      char *titre;
      char *interprete;
      int duree;
     };
    dans une fonction j'ai cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    struct listeplaylist *lasx
    lasx=NULL;
    lasx=Cherche_playlists(nomdoss, chemin, lasx, ".asx");
    avec nomdoss = le nom du dossier "racine" de la recherche, et chemin= une chaine vide pour l'instant

    la fonction appellée est une fonction récursive
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct listeplaylist *Cherche_playlists(char racine[], char chemin[], struct listeplaylist *pdeb, char extension[5])
    l'appelle récursif est écrit comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    char *dosscour;
     struct listeplaylist pcour;
       dosscour=(char*) calloc(strlen(chemin)+2,sizeof(char));
       strcpy(dosscour,chemin);
       strcat(dosscour,"/");
       pdeb=Cherche_playlists(Dossier.cFileName, dosscour, pdeb, extension);
       SetCurrentDirectory("..");
    lorsque je trouve un fichier ayant la bonne extention je lui demande ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       dosscour=(char*) calloc(strlen(chemin)+strlen(Dossier.cFileName)+2,sizeof(char));   
       strcpy(dosscour,chemin);
       strcat(dosscour,"/");
       strcat(dosscour,Dossier.cFileName);
       pcour.chemin=(char*) calloc(strlen(dosscour)+1,sizeof(char));
       strcpy(pcour.chemin,dosscour);
       pcour.psuiv=pdeb;
       pdeb=&pcour;
    le fichier se termine par
    le seul problème c'est qu'il me renvoie invariablement une adresse folkorique ne pointant sur rien, ce qui fait planter toute la suite du programme.

    je ne comprend pas où est mon problème...

    ah et pour ccensam : c'est bien de faire le malin et de me prendre pour un abruti, profite. les listes, ca va, je connais. Mais c'est la première fois que je m'y frotte en C...

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     struct listeplaylist pcour;
    Déclaration d'une variable locale à ta fonction.

    Or ici:

    Copie d'une adresse d'une variable locale

    Et finalement, ici:

    Retour d'une adresse locale qui ne sera donc plus valide...

    Sans voir tout le code, c'est difficile d'en dire plus...

    Jc

  8. #8
    Membre du Club
    Inscrit en
    Février 2006
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 8
    Par défaut
    mais comme je copie l'adresse de variable locale dans une globale, ca devrait pas la sauver ??
    sinon, comme puis-je faire pour construire correctement la liste si il est impossible de faire l'instruction pdeb=&pcour qui chaine le tout ??

    et le code complet de la fonction incriminée est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    struct listeplaylist *Cherche_playlists(char racine[], char chemin[], 
    struct listeplaylist *pdeb, char extension[5])
    {
     WIN32_FIND_DATA Dossier; 
     HANDLE Recherche; 
     boolean re=TRUE; 
     char *dosscour;
     struct listeplaylist pcour;
     strcat(chemin,racine);
     printf("%s\n", chemin);
     
     if(SetCurrentDirectory(racine)==0)
      return(NULL);
     Recherche=FindFirstFile("*.*", &Dossier);
     re = FindNextFile(Recherche, &Dossier);
     re = FindNextFile(Recherche, &Dossier);
     while (re)
     {
      if (Dossier.dwFileAttributes==FILE_ATTRIBUTE_DIRECTORY)
      {  //appelle récursif de la fonction pour parcourir ce sous-dossier
       dosscour=(char*) calloc(strlen(chemin)+2,sizeof(char));
       strcpy(dosscour,chemin);
       strcat(dosscour,"/");
       pdeb=Cherche_playlists(Dossier.cFileName, dosscour, pdeb, extension);
       SetCurrentDirectory("..");
      } 
     
      if (strcmp(&Dossier.cFileName[strlen(Dossier.cFileName)-4],extension)==0)
      {
       printf("   Playlist trouvée : %s\n",Dossier.cFileName);
       dosscour=(char*) calloc(strlen(chemin)+strlen(Dossier.cFileName)+2,sizeof(char));
     
       strcpy(dosscour,chemin);
       strcat(dosscour,"/");
       strcat(dosscour,Dossier.cFileName);
       pcour.chemin=(char*) calloc(strlen(dosscour)+1,sizeof(char));
       strcpy(pcour.chemin,dosscour);
       pcour.psuiv=pdeb;
       pdeb=&pcour;
     
      }
      re = FindNextFile(Recherche, &Dossier);
     }
     FindClose(Recherche);
     return(pdeb);
    }

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par LLaval
    mais comme je copie l'adresse de variable locale dans une globale, ca devrait pas la sauver ??
    Non. L'adresse doit être valide. Pour ça, 2 solutions 'réelles' :
    • Donner une adresse valide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      T data;
      f(&data);
    • Retourner une l'adresse d'un bloc alloué avec malloc() (dans la fonction)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      T *p_data = f();
      if (p_data != NULL)
      {
          /* ... */
          free (p_data), p_data = NULL;
      }
    • Il y a une troisième méthode (retourner l'adresse d'une statique), mais elle est foireuse.

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/02/2005, 23h42
  2. Bibliothèque de listes chainées
    Par gege2061 dans le forum C
    Réponses: 29
    Dernier message: 17/12/2004, 20h15
  3. copie de liste chainée
    Par tomsoyer dans le forum C++
    Réponses: 15
    Dernier message: 31/08/2004, 18h20
  4. Trie liste chaine
    Par Congru dans le forum C
    Réponses: 2
    Dernier message: 30/03/2004, 19h05
  5. tri de liste chainée
    Par RezzA dans le forum C
    Réponses: 7
    Dernier message: 26/01/2003, 20h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo