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 :

Probleme de pointeurs


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    338
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 338
    Points : 0
    Points
    0
    Par défaut Probleme de pointeurs
    Salut!
    je voulais faire des procédures en C pour enfiler et défiler un élément d’une liste chagrinée , voila le code :
    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
     
     
    //structure frontiere
    struct noeudf {
      int grille[9];
      int niv;
      struct noeudf *suiv;
    };
    typedef struct noeudf* frontiere;
     
     
    frontiere creation_nf(int vval[])
    {    frontiere e = NULL ;
        e = (frontiere)malloc(sizeof(struct noeudf));
        if(e!=NULL) {
            int i;
        for(i=0;i<9;i++){e->grille[i] = vval[i] ;}
            e->suiv;
        }
        return e ;
    }
     
     
    /*xxxxxxxxxxxx ENFILER UN NOEUDF DANS LA FRONTIERE xxxxxxxx*/
    void enfiler_f_n(frontiere* l,frontiere e)
    {   frontiere  q = *l ;
     
        if(q==NULL) {*l =e;}
        else {
           while(q->suiv!=NULL) {q = q->suiv ;}
            q->suiv = e ;
     
        }
    }
     
     
    /*xxxxxxxxxxxx DENILER UN NOEUDF DANS LA FRONTIERE xxxxxxxx*/
    frontiere defiler_f_n(frontiere* l)
    {
    frontiere p=*l, q=p->suiv;
    if(p!=NULL){
                *l=q;
                p->suiv=NULL;
                return p;
                }
    free(p);
    }
    mais j'ai eu des problémes au niveau des procédures "enfiler_f_n" et "defiler_f_n " (si je veux enfiler un élément ça passe si la liste et vide mais il y a un probléme si la liste n'est pas vide) et d’après le debugger le problème ce trouve au niveau de l'instruction suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(q->suiv!=NULL) {q = q->suiv ;}
    Aidez moi svp!

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    liste chagrinée
    Problème d'autocorrect?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct noeudf* frontiere;
    Le typedef struct chainon* liste;, c'est une des pires choses à enseigner aux débutants: Ça cause plus de confusion qu'autre chose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    e = (frontiere)malloc(sizeof(struct noeudf));
    On n'a pas à caster le retour de malloc() en C.
    Cette ligne ne fait rien du tout. Je pense que tu voulais écrire e->suiv=NULL;.
    Je pense que cette erreur fait planter.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void enfiler_f_n(frontiere* l,frontiere e)
    {   frontiere  q = *l ;
    l et e ne sont pas du tout explicite comme noms. Tu devrais leur donner des noms plus explicites, comme ppPremier et pNouveau.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    frontiere defiler_f_n(frontiere* l)
    {
    frontiere p=*l, q=p->suiv;
    if(p!=NULL){
    Attention, tu déréférences p avant de tester s'il est nul.
    Cela causera un comportement indéfini (probablement un plantage) si tu appelle defiler_f_n() sur une liste vide.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 985
    Points
    30 985
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par mohsenuss91 Voir le message
    ...un élément d’une liste chagrinée ,
    Salut
    Oui je comprends qu'on puisse en pleurer...

    Citation Envoyé par mohsenuss91 Voir le message
    voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //structure frontiere
    struct noeudf {
      int grille[9];
      int niv;
      struct noeudf *suiv;
    };
    typedef struct noeudf* frontiere;
    Medinoc t'a dit que ça c'était absolument à proscrire. Masquer un pointeur c'est crash assuré.

    Perso je te conseillerais non seulement de définir ton noeud maillon de liste mais aussi de définir un type dédié à la liste elle-même. Style
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct s_noeudf {
      int grille[9];
      int niv;
      struct s_noeudf *suiv;
    } t_noeud;
     
    typedef struct {
        t_noeudf *racine;
    t_liste;

    Ainsi, rien qu'en passant un simple pointeur t_liste, tu accèdes à la racine et peut la modifier sans te coltiner tes ** que tu es obligé de masquer parce que tu ne les maitrises pas. Et tu accèdes aussi à tous les maillons de la liste.
    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void initListe(t_liste*liste)
    {
        liste->racine=NULL;
    }
     
    int main()
    {
        t_liste liste;
        initListe(&liste);
    }

    Autre avantage: le jour où tu veux rajouter des outils (comme le nb d'éléments ou autre), te suffit de le rajouter dans ton t_liste et toutes les fonctions qui le reçoivent y auront instantanément accès.

    Exemple
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    typedef struct {
        t_noeudf *racine;
        unsigned short nb_elem;
    t_liste;
     
    void initListe(t_liste*liste)
    {
        liste->racine=NULL;
        liste->nb_elem=0;
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,


    je voulais faire des procédures en C
    Cela m'étonne que personne n'ai tiqué dessus.

    En C les procédures n'existent pas, on a que des fonctions

Discussions similaires

  1. probleme de pointeur ....
    Par berg dans le forum C
    Réponses: 6
    Dernier message: 12/01/2006, 22h46
  2. Probleme de pointeur
    Par Naruto_kun dans le forum C
    Réponses: 17
    Dernier message: 14/12/2005, 20h47
  3. Probleme de pointeurs
    Par mickyoun dans le forum C++
    Réponses: 9
    Dernier message: 10/08/2004, 17h15
  4. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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