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 :

structures et pointeurs


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Par défaut structures et pointeurs
    Bonjour! je voudrais implementer un graphe et voici donc mes debuts:
    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
     
    struct elementadjacent
        { int info;
          struct elementadjacent *suivant;
        };
     
    struct sommet
        {  int label;
            int info;
            struct elementadjacent *adj;
            struct sommet* suivant; 
       };
     
    struct graphe
      {  int nbSommet;
          int nbArete;
          int maxSommet;
          struct sommet* premierSommet;
          struct sommet* dernierSommet;
     }
     
    //initialisation du graphe
    void InitGraphe(graphe *g)
     { g=new graphe;
        (*g).nbSommet=0;
        (*g).nbarete=0;
        (*g).maxSommet=0;
        g.premierSommet=NULL;
        g.dernierSommet=NULL;
      }
    Je voudrais donc savoir est-ce que ma procedure InitGraphe est bien implementer? et commet proceder pour ecrie la procedure ajoutSommet(graphe* g,int S)?
    Merci d'avance

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Ton init graph n'est pas comme il faut, si tu fais comme sa:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    graph *g;
    g=NULL;
    InitGraph(g);
    g vaudra NULL apres l'appel de InitGraph, il vaut mieux faire comme ça:
    InitGraph(graph *&g)
    (je suis pas sur si la syntaxe est celle-ci, donc me corriger si necessaire).
    Pour prendre la référence sur pointeur de g

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Je voudrais donc savoir est-ce que ma procedure InitGraphe est bien implementer?
    Non.
    1- Il y a une erreur de principe : g est un paramètre de la fonction. Le rôle d'un paramètre est de transmettre une valeur à une fonction, valeur nécessaire à son fonctionnement. Or dans ton code, la première chose que tu fais est g=... ce qui écrase la valeur transmise à la fonction. Ceci prouve que la valeur transmise à g n'a pas d'importance donc que g n'a pas à être un paramètre mais une simple variable locale.
    2- graphe n'est pas un type, c'est struct graphe le type (on est dans le forum C)
    3- new n'est pas du C. On doit utiliser malloc() (on est dans le forum C)
    4- (*g).nbSommet n'est pas faux mais une syntaxe lourde et avantageusement remplacée par g->nbSommet
    5- g.premierSommet est faux : g n'est pas une struct/union mais une adresse de struct/union. La syntaxe est la même qu'en 4.
    6- La fonction crée (ou devrait créer) une struct graphe dynamiquement. Il faut donc qu'elle retourne l'adresse de la structure créée.

    Donc globalement :
    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
    //initialisation du graphe
    struct graphe * InitGraphe(void)
    { 
       struct graphe * g=malloc(sizeof *g);
       if(g != NULL)
       {   
          g->nbSommet=0;
          g->nbarete=0;
          g->maxSommet=0;
          g->premierSommet=NULL;
          g->dernierSommet=NULL;
       }
       return g;
    } 
    ....
    struct graphe * gra = InitGraphe();
    if(gra != NULL)....

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Par défaut
    Merci pour la reponse mais je voudrais ma procedure InitGraphe prenne un parametre peu importe qu'il renvoie ou ne renvoi rien

  5. #5
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Dans ce cas tu fais comme ça:

    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
    //initialisation du graphe
    void InitGraphe(struct graphe **ret)
    { 
       struct graphe * g=malloc(sizeof *g);
       if(g != NULL)
       {   
          g->nbSommet=0;
          g->nbarete=0;
          g->maxSommet=0;
          g->premierSommet=NULL;
          g->dernierSommet=NULL;
       }
       *ret=g;
    }
     
    struct graphe *g=NULL;
    InitGraph(&g);

  6. #6
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2009
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2009
    Messages : 68
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void InitGraphe(struct graphe **ret
    Deux etoiles??? pointeur sur un pointeur de struct graphe? j n comprend pa bien cette ligne

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Deux etoiles??? pointeur sur un pointeur de struct graphe? j n comprend pa bien cette ligne
    Cela permet de modifier la valeur du pointeur "g" situé hors de cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct graphe *g=NULL;
    InitGraph(&g);
    Après l'appel de la fonction, "g" est modifié (sauf si l'allocation de mémoire a échoué, bien entendu).

  8. #8
    Membre extrêmement actif
    Avatar de lilington
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    681
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2005
    Messages : 681
    Par défaut
    Citation Envoyé par yabo84 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void InitGraphe(struct graphe **ret
    Deux etoiles??? pointeur sur un pointeur de struct graphe? j n comprend pa bien cette ligne
    en faite tu envois l'adresse du pointeur a modifier. regarde l'appelle de la fonction que t'as donne skeu:
    en faisant ainsi lorsque le dit donne comme information l'addresse du pointeur a modifier le resultat c'est que dans ta fonction tu modifies le pointeur mais a l'exterieur l'addresse initial du pointeur n'a pas change. c'est surtout du au fait que tu utilise malloc dans la fonction qui peut deplacer le pointeur si necessaire.

Discussions similaires

  1. Structures et pointeurs
    Par Tchetch dans le forum C
    Réponses: 14
    Dernier message: 19/10/2006, 13h30
  2. Structure et pointeur
    Par Nalido dans le forum C
    Réponses: 5
    Dernier message: 08/08/2006, 15h08
  3. Copie de structure par pointeur - Problème LSB MSB
    Par the_ionic dans le forum Réseau
    Réponses: 4
    Dernier message: 17/07/2006, 15h08
  4. Structures et pointeurs
    Par mastochard dans le forum C
    Réponses: 17
    Dernier message: 25/05/2006, 11h55
  5. [structure et pointeur] problème d'affichage
    Par kitsune dans le forum C
    Réponses: 17
    Dernier message: 22/03/2006, 22h20

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