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 :

Pointeur et accès structure


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut Pointeur et accès structure
    Bonjour voila j'ai un petit problème... J'ai deux structures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct TMaillon Maillon;
     
    struct TMaillon {
       void *motchaine; /* mot lu et stocke dans la liste chaînée */
       LC *ptrLigneColonne; /* ponteur sur la structure LC */
       Maillon *suivant; /* adresse du prochain maillon de la liste chaînée */
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* la structure TLC */
    typedef struct TLC LC;
     
    struct TLC {
        int Ligne, Colonne; /* ligne et colonne d'un mot */
        LC *suivant; /* adresse du prochain maillon de la liste chaînée LC */
    };
    La première structure possède un pointeur permettant d'acceder aux données de la deuxième.
    Cependant dès que je tente de faire une lecture sur la structure LC par l'intermediaire du pointeur ptrLigneColonne, mon programme s'arrete sur le message d'erreur : "erreur de segmentation".

    sachant que je tente d'accéder par ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaChaine_move->ptrLigneColonne->Ligne
    et que la structure LC se remplie bien...

    Merci pour vos conseils.

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Salut !

    Question bête : tu initialises MaChaine_move->ptrLigneColonne ?

    Et pourquoi un void* ? si c'est une chaîne de caractères, pourquoi ne pas utiliser un char* ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    C'est pour un projet scolaire...ils veulent appliquer le principe de généricité donc je suis obligé de mettre un void*
    Arf en effet j'ai testé la validité de MaChaine_move->ptrLigneColonne et il n'est pas valide...mais je vois pas à quoi l'initialiser

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    comment initialises-tu MaChaine_move ?
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    MaChaine_move me permet juste de parcourir ma liste chaînée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(MaChaine_move=MaChaine; MaChaine_move!=NULL; MaChaine_move=MaChaine_move->suivant)
    {
       printf("%s ",MaChaine_move->motchaine);
       if(MaChaine_move->ptrLigneColonne) printf("huhu"); //test validité pointeur 
    }

  6. #6
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    dans ce cas, c'est la création de ta liste chaînée qui est foireuse
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    Citation Envoyé par Swoög
    dans ce cas, c'est la création de ta liste chaînée qui est foireuse
    Je ne pense pas puisque je peux la parcourir sans problème et afficher son contenu.

  8. #8
    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
    Ta liste est peut-être bonne mais pas les pointeurs sur LC.

    Montre ton code en entier.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    je crée un nouveau maillon de ma liste chaînée, je remplie ce maillon avec les données (cest-à-dire le mot), puis j'appelle ma fonction de création de la deuxième liste (type LC) :
    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
     Maillon *inserer_debut(Maillon *NewMaillon, int Taillemot, char *MotLu, int Numligne)
    {
          Maillon *vMaillon = NULL;
          /* on alloue la memoire pour le nouvel element */
        if((vMaillon = (Maillon *)malloc(sizeof(Maillon))) == NULL)
        {    perror("malloc failed ");
            exit(1);
        }
        
        /* Creation du tableau pour le mot */
        vMaillon->motchaine = malloc (Taillemot*sizeof(char));
        if( vMaillon->motchaine == NULL )
        {
            fprintf(stderr,"Allocation impossible pour motchaine");
            exit(EXIT_FAILURE);
        }
       /* on copie le mot pour le stocker */
        strcpy(vMaillon->motchaine, MotLu);
    
        /* on appelle maintenant la fonction pour crée un maillon de type LC */
        LC* ptrLigneColonne = inserer_debutLC(ptrLigneColonne, Numligne);
     
        /* comme il s'agit du premier élément, il n'y a rien après */
          vMaillon->suivant = NULL;
          /* on renvoie notre element */
          return(vMaillon);
    }
    Ma fonction inserer_debutLC :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    LC *inserer_debutLC(LC *NewLC, int Numligne)
    {
        LC *vMesLC = NULL;
        /* on alloue la memoire pour le nouvel element */
        if((vMesLC = (LC *)malloc(sizeof(LC))) == NULL)
        {    perror("malloc failed ");
              exit(1);
        }
        vMesLC->Ligne = Numligne;
        printf("%d", Numligne); /* test pour vérifier le remplissage */
        vMesLC->suivant = NULL;
        return(vMesLC);
    }

  10. #10
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    à quoi te servent Maillon *NewMaillon et LC *NewLC dans tes fonctions ? tu ne les utilises jamais !

    de plus, tu n'assignes ptrLigneColonne à rien... à mon avis il y a de très gros problèmes là... c'est tout à fait normal que ça plante !!

    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
    Maillon *inserer_debut(int Taillemot, char *MotLu, int Numligne)
    {
          Maillon *vMaillon;
          /* on alloue la memoire pour le nouvel element */
        if((vMaillon = (Maillon *)malloc(sizeof(Maillon))) == NULL)
        {    perror("malloc failed ");
            exit(EXIT_FAILURE);
        }
     
        /* Creation du tableau pour le mot */
        vMaillon->motchaine = malloc (Taillemot*sizeof(char));
        if( vMaillon->motchaine == NULL )
        {
            fprintf(stderr,"Allocation impossible pour motchaine");
            exit(EXIT_FAILURE);
        }
       /* on copie le mot pour le stocker */
        strcpy(vMaillon->motchaine, MotLu);
     
        /* on appelle maintenant la fonction pour crée un maillon de type LC */
        vMaillon->ptrLigneColonne = inserer_debutLC(Numligne);
     
        /* comme il s'agit du premier élément, il n'y a rien après */
          vMaillon->suivant = NULL;
          /* on renvoie notre element */
          return(vMaillon);
    }
     
     
     
     
     
    LC *inserer_debutLC(int Numligne)
    {
        LC *vMesLC;
        /* on alloue la memoire pour le nouvel element */
        if((vMesLC = (LC *)malloc(sizeof(LC))) == NULL)
        {    perror("malloc failed ");
              exit(EXIT_FAILURE);
        }
        vMesLC->Ligne = Numligne;
        printf("%d", Numligne); /* test pour vérifier le remplissage */
        vMesLC->suivant = NULL;
        return(vMesLC);
    }
    et ça c'est sans corrigé la copie pour la chaîne de caractère (en théorie, tu n'as pas besoin de fournir sa taille, strlen te permet facilement de la récupérer... et si tu souhaites copier une taille fixée d'avance, tu devrais plutôt utiliser strncpy pour éviter les débordements...
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 93
    Par défaut
    Arf heu oui se sont de vieux restes *passe encore pour un boulet*
    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Renvoyer un pointeur de type structure
    Par bluecurve dans le forum C
    Réponses: 2
    Dernier message: 18/05/2007, 21h29
  2. Réponses: 67
    Dernier message: 13/02/2007, 19h08
  3. Réponses: 2
    Dernier message: 26/11/2006, 11h51
  4. pointeur vers une structure
    Par Xyrroa dans le forum C
    Réponses: 14
    Dernier message: 12/04/2006, 14h13
  5. [GCC] Tableau de pointeurs pour accès multiples en asm
    Par Flo. dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 12/12/2005, 09h47

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