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 :

Passage de structure en parametre fonction : Pointeur


Sujet :

C

  1. #1
    Membre du Club Avatar de apicard3
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Points : 50
    Points
    50
    Par défaut Passage de structure en parametre fonction : Pointeur
    Bonjour a tous,

    J'ai cette semaine un petit probleme sur le passage d'une structure en parametre de fonction. Je m'explique clairement :

    Voici ma structure (une structure de graphe) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct TypGraphe2 {
            int       	nbMaxSommets;
            TypVoisins**   	listesAdjacences;
    } TypGraphe;

    Voici maintenant mon code ou j'essaye de la passer en parametre :

    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
    int main(void) {
     
            TypGraphe* g  = NULL;          //initialisation du graphe                                  
            int choix = 0;
     
            while (1) {
     
    		entree(&choix); //recuperation saisie utilisateur
    		if(choix == 0) { return 0; } //quitter si choix == 0
     
    		switch(choix){
     
    			case 2 :
    				lectureFichier(g); // passage du graphe en parametre
    				break;
    			...//fonctions intermédiaires
    			case 7 :
    				affichage(g);
    				break;
    			case 0 :  
    				quitter(g);
    				break;		                        
    		        default:
    		                print("Saisie non valide");
    		                break;
    		}
    	}	
    }

    Et voici le code de la fonction lectureFichier :

    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
    void lectureFichier(TypGraphe* g){
    	if (g == NULL) {
    		char name[2048];
    		print("Chemin du fichier: ");
    		printf("->");
    		lectureChemin(name, 2048); //name est le chemin saisie		
    		if (name != NULL)
    			g = lecture(name); // lecture du graphe (retourne TypGraphe*)
    		else
    			return 0;
    		if (g == NULL) 
    			print("Echec de lecture\n");
    		else 
    			print("Lecture finit");
    	}
    	else
    		print("Le graphe est deja ouvert");
    }

    Donc pour résumer : La fonction main creer un nouveau graphe (c'est la structure) et le passe en parametre dans une fonction qui va le modifier. (J'ai absolument besoins de le passer en parametre dans la fonction et non pas d'en creer un nouveau)
    Mon code fonctionne, aucun message d'erreur, mais lorsque je lit un graphe (la fonction lectureFichier), le graphe principale du main n'est pas modifié. Et ainsi si je rappelle cette meme fonction, on va me redemander le chemin du fichier a lire et non pas dire "ton graphe n'est plus null alors il est deja ouvert" (else dans la fonction lectureFichier).

    Donc pour conclure je pense que quelque chose a foirer sur les pointeurs.



    Merci de votre aide!

    Alexis

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2011
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 27
    Points : 34
    Points
    34
    Par défaut
    Il faut voir tout d'abord vérifier que la fonction lecture (name) ne retourne pas d'objet NULL. Ensuite, je ne sais pas si je me trompe, qu'on me corrige si je dis quelque chose de pas correct, mais l'objet retourné par lecture (name) et pointé par g sera détruit après la fermeture de l'accolade. Tu devrais faire un malloc à ton pointeur afin de lui allouer une section de mémoire et t'assurer qu'il ne sera pas détruit.

    L'autre point selon moi, ça serait d'utiliser le passage par référence qui t'aurais aidé pour ce cas. Tu aurais pu créer ton objet de la manière suivante.

    Ensuite mettre le paramètre de ta fonction sous forme de référence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void lectureFichier(TypGraphe& g)
    Et ensuite passer ta variable en paramètre. Ainsi, ta fonction lecture(name) pourrait retourner une variable et non un pointeur.

  3. #3
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Oulalalala... c'est du C++ ce que tu donnes, pas du C.

    Les déclaration de fonctions ne contiennent pas de &, c'est uniquement dans le code lors de l'affectation.
    Il n'y a aucun objet en C (ouf !).
    Et g ne sera pas détruit en fin d'accolade vu que c'est un pointeur (enfin g tout seul oui, mais pas ce qu'il pointe).

    Les problèmes :
    - c'est qu'il n'y a aucun malloc de la structure de ce que je vois... sauf si lecture le remplit effectivement.
    - LA erreur : if (name != NULL) et char name[2048]; (sauf si C99)

    Le if retournera toujours vrai, car char[2048] n'a pas une adresse NULL... vu que c'est un tableau et non un pointeur.

    Tu devais faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char name[2048] = "";
     
    if (strlen(name) == 0)
    Et ça devrait te corriger la chose.

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Si je comprend l'idée, l'objet TypGraphe est créé par la fonction lecture(), par allocation dynamique, qui renvoie son adresse (si il n'avait pas été déjà créé par un appel antérieur à lectureFichier()) .
    Cette adresse doit être communiquée à la fonction qui appelle lectureFichier() et ce n'est pas le cas : la fonction lectureFichier() est de type void (pourquoi y a t-il un return 0 dans cette fonction ???) et ne modifie que la variable locale g.

    Tu as donc le choix suivant:
    1- utiliser la valeur de retour de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TypGraphe* lectureFichier(TypGraphe* g)
    {
      if (g == NULL) 
      {
       ...		
         if (name[0] != '\0')   // name est non vide
             g = lecture(name); // lecture du graphe (retourne TypGraphe*)
         else return NULL;
       ...
      }
      else 	print("Le graphe est deja ouvert");
      return g;
    }
    Appel : g = lectureFichier(g); .


    2- Utiliser la liste des paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void lectureFichier(TypGraphe* *g)
    {
      if (*g == NULL) 
      {
       ...		
         if (name[0] != '\0')    // name est non vide
             *g = lecture(name); // lecture du graphe (retourne TypGraphe*)
         else return;
         if (*g == NULL)
       ...
      }
      else 	print("Le graphe est deja ouvert");
    }
    Appel : lectureFichier(&g); .

  5. #5
    Membre du Club Avatar de apicard3
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Points : 50
    Points
    50
    Par défaut Merci
    Bonsoir,

    Je tiens a vous remercier pour vos réponses ultra rapides, clair et précises qui ont porté ces fruits!

    J'ai utiliser la réponse de diogene pour résoudre, c'est exactement ce que je cherchais. J'ai pris la deuxieme solution, mais la première irait très bien aussi (peut etre pour mes autres fonctions de graphe qui sait).

    C'était peut etre tout bete comme question, mais j'ai énormément de mal à comprendre la gestion mémoire du c. Enfin bref, je vais pouvoir continuer et rendre au plus vite ce "truc"!

    Merci

    Alexis

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Merci de cliquer sur le bouton en bas de l'écran si vous n'avez plus de question.

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

Discussions similaires

  1. Passage tableau string en parametre par pointeur
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/03/2011, 11h10
  2. Passage d'un programme en fonctions pointeur.
    Par bambam978 dans le forum Débuter
    Réponses: 6
    Dernier message: 21/12/2008, 10h14
  3. tableau de structure en parametre fonction
    Par Dark_Alex69 dans le forum Débuter
    Réponses: 3
    Dernier message: 12/11/2007, 18h38
  4. Passage de structure en parametres
    Par beb30 dans le forum Visual C++
    Réponses: 10
    Dernier message: 28/08/2006, 17h31
  5. Réponses: 7
    Dernier message: 08/04/2006, 12h18

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