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 :

fonction retournant une structure.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    Par défaut fonction retournant une structure.
    Bonjour,

    Aujourd'hui, en tp de structure de données (C), nous avons été confronté à un petit problème auquel même le prof ne comprend pas exactement ce qui ne va pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct
    {
           char mot[26];
           char definition[26];
    }Noeud;
     
    Noeud fonction(....)
    {
         Noeud mon_noeud;
         //traitement...
         return mon_noeud;
    }
    théoriquement en faisant fonction.mot ou fonction.definition, on accède au mot/définition du Noeud mon_noeud.

    Mais si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("%s", fonction().mot);
    on a SEGFAULT,
    si on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strcmp(fonction().mot, "blabla");
    On a une erreur de lvalue (je ne me souvient pas exactement de l'erreur).

    Alors que si on passe par une variable intermédiaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Noeud tmp = fonction();
    printf("%s\n", tmp);
    strcmp(tmp, "blabla");
    Tout ce passe bien.

    Est-ce que cela pourrait venir du fait que Noeud soit composé d'une chaîne de caractère?
    Mais comme les chaîne de caractères sont déclarées comme des tableaux fixes, théoriquement, ils sont stocké au sein même de la structure Noeud.
    Ce n'est donc pas un pointeur contenu dans Noeud qui pointerais vers un tableau extérieur, donc tant que le Noeud n'est pas désalloué, les deux chaînes de caractères ne le sont pas non plus.

    Peut être que le pointeur (mot) de tmp (pointant sur mot[0]) est "mis à jour" lors de l'affectation.

    Lorsqu'on utilise fonction().nom, on utilise un pointeur qui pointe sur le mot[0] local de la fonction.
    Or comme on a déjà quitté la fonction, le mon_noeud est désalloué.
    Le pointeur mot de la valeur de retour de fonction pointerais donc sur mot[0] de mon_noeud?

    Qu'en pensez-vous?

  2. #2
    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
    En C, les fonctions ne renvoient jamais un objet mais une valeur. L'entité renvoyée n'a pas d'adresse (au sens du C naturellement : on ne peut appliquer l'opérateur unaire & à la valeur de retour d'une fonction).

    Le retour d'une fonction n'est donc pas une lvalue, autrement dit, on ne peut avoir fonction()=.... (mais on peut avoir *fonction() = ..., si fonction renvoie une adresse ou fonction()->... = ... si elle renvoie l'adresse d'une structure ).

    C'est valable pour le retour d'une structure et par conséquent les membres d'une structure renvoyée par une fonction ne sont pas non plus des lvalue. Ce n'est pas lié à la nature des membres.

    cf Concepts en C §III-A-1

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nous avons été confronté à un petit problème auquel même le prof ne comprend pas exactement ce qui ne va pas.
    C'est le même prof qui t'a parlé de feof() ?


    Merci à toi diogene pour l'explication rigoureuse du problème dont je devinais la solution mais pas de manière aussi claire

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    Par défaut
    Merci pour ta réponse.

    Je n'avais jamais entendu parler de "valeur" jusqu'à aujourd'hui.

    J'ai lu vite fait ton lien mais je pense que je vais relire la totalité du tutoriel pour mieux comprendre tout cela.

    Si je comprend bien, la fonction renvois une "valeur" qui contient l'adresse de l'objet.
    Une "valeur" contient donc la même information qu'un pointeur (?).
    Mais j'ai pas l'impression qu'une ''valeur'' soit la même chose qu'un pointeur.

    Je vais essayer de lire ça demain et je poserais peut être quelques questions ici.

    Encore merci

    EDIT : je suis en train de lire et je viens de voir que j'ai dit une grosse bêtise : la valeur est l'information contenue dans l'objet.

  5. #5
    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
    Le terme "valeur" est pris ici dans le sens "ce qui quantifie une information" : 3 est une valeur entière, 3.14 une valeur réelle, NULL et &a des valeurs "adresse" (a doit être un objet), true et false des valeurs booléennes ... Elles peuvent apparaitre de façon littérale ou être stockées dans des objets. En fait, ce sont des constantes.

    Ce n'est hélas pas conforme à la définition "résultat d'une évaluation" pour le C, puisqu'en C, ce résultat peut parfois désigner un objet, comme dans *p où p est une valeur "adresse" (celle contenue dans l'objet pointeur p). L'expression *p est une lvalue.
    Si je comprend bien, la fonction renvois une "valeur" qui contient l'adresse de l'objet.
    Pas du tout. Si on a un return x où x est un objet, elle retourne la valeur stockée par l'objet x (sauf pour les tableaux), pas l'adresse de x

    Mais j'ai pas l'impression qu'une ''valeur'' soit la même chose qu'un pointeur.
    Ca n'a rien à voir. Un pointeur est un objet qui stocke des valeurs de type "adresse". Les adresses sont parfois qualifiées de "constantes pointeur". Pour éviter la confusion avec des "pointeurs constants", je préfère le terme "adresse", plus simple et plus clair.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    Par défaut
    j'ai fini de lire ce tutoriel et j'ai adoré.

    Il y avait pas mal de choses qu'on ne voit pas du tout en cours, c'est assez regrettable...

    Dommage aussi qu'il n'y ai pas d'autre tutoriels de ta main.

    Merci encore pour ce lien, je pense avoir tout compris, je marque donc ce sujet en résolu.

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

Discussions similaires

  1. fonction qui retourne une structure ?
    Par tootook dans le forum Débuter
    Réponses: 2
    Dernier message: 19/05/2012, 13h39
  2. Réponses: 3
    Dernier message: 01/03/2010, 17h20
  3. retourner une structure pour une fonction
    Par emardjean dans le forum C
    Réponses: 5
    Dernier message: 24/01/2007, 20h36
  4. Réponses: 6
    Dernier message: 14/02/2006, 11h29
  5. fonction retournant une valeur
    Par ryan dans le forum ASP
    Réponses: 4
    Dernier message: 06/09/2004, 17h45

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