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 sur structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Par défaut Pointeur sur structure
    Bonjour,

    C'est quoi la différence entre les deux codes, et que ce que je peux gagner comme mémoire?

    /**************code 1 ****************/
    je déclare defaut de type tCodeDefaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	typedef struct 
    	{
    		int  code;
    		char description [255];
    	} tCodeDefaut;
     
    tCodeDefaut	defaut;
    je passe l'adresse de defaut a la fonction de GenererCodeDefaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenererCodeDefaut (&defaut);
    /**************code 2 ****************/
    je déclare defaut de type pointeur sur tCodeDefaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	typedef struct 
    	{
    		int  code;
    		char description [255];
    	} tCodeDefaut;
     
    tCodeDefaut	*defaut;
    je passe l'adresse de defaut a la fonction de GenererCodeDefaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GenererCodeDefaut (defaut);
    /**************************************/

    Si le même chose, parce que j'ai lit dans des cours C avancé que passer à une fonction un variable de type structure sa prend beaucoup en RAM
    par contre passer un pointeur sur structure va être charger dans le stack
    et va être plus économique en mémoire

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Hum...! Disons qu'on pourrait prendre un exemple de la vie courante pour mieux comprendre.

    Imaginons que nous ayons une voiture qui a besoin de réparation. D'après toi, qu'est-ce qui va prendre le plus de temps ?
    1. Récupérer l'adresse du garagiste et s'y rendre,
    2. déplacer le garage, avec tous les outils, le réparateur, les bâtiments... jusqu'à la voiture.


    Il me semble qu'il est bien plus pratique et performant d'amener la voiture au garagiste et non l'inverse.

    Ceci dit il y a encore un soucis à transmettre une donnée directement. En C cette donnée est transmise par copie. Ce qui signifie que toute modification de la donnée transmise n'aura aucun effet au retour de la fonction sur la donnée passée.

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Par défaut pointeur sur structure
    Bonjour,

    excellent exemple

    par contre dans les deux codes j'ai envoyé à la fonction l'adresse de variable defaut !!!!

    Merci d'avance

  4. #4
    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
    Il y a comme différence que dans le code 2, tu passe la valeur d'un pointeur, mais que ce pointeur n'a pas été initialisé auparavant avec l'adresse d'une structure tCodeDefaut : créer un pointeur ne crée pas l'objet pointé. Il aurait fallu avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef struct 
    {
       int  code;
       char description [255];
    } tCodeDefaut;
     
    tCodeDefaut uneStructCodeDefaut;
    tCodeDefaut *defaut = &uneStructCodeDefaut; 
    GenererCodeDefaut (defaut);
    Alors, les deux codes sont équivalents et dans les deux cas, on passe l'adresse d'une structure (et non pas la structure)

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Avril 2012
    Messages : 4
    Par défaut pointeur sur structure
    Bonjour,

    je veux savoir mieux techniquement (en terme de mémoire et de vitesse d'exécution ) la différence entre le passage à une fonction une structure et un pointeur sur structure (les emplacements dans le RAM, Stack...)

    Merci d'avance

  6. #6
    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
    Les arguments passés à une fonction donnent lieu à
    - création d'une variable locale du type correspondant au paramètre de la fonction
    - copie de l'argument correspondant dans cette variable.

    1- Si on passe une structure, une structure de même type va être créée sur la pile et la structure en argument copiée dedans

    2- Si on passe une adresse de structure, un pointeur sur structure va être créé sur la pile et l'adresse de la structure copiée dedans

    Evidemment, si la structure est un peu volumineuse, la solution 1 va être pénalisante en temps et en occupation mémoire et on préfère la solution 2.

    On peut également montrer, dans la solution 2, qu'en fait c'est uniquement le contenu de la structure qui intéresse et qu'on ne veut pas pour autant le modifier en utilisant le modificateur const dans la déclaration des paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void GenererCodeDefaut ( const tCodeDefaut * codedefaut);

  7. #7
    Membre confirmé
    Profil pro
    amateur
    Inscrit en
    Avril 2012
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : amateur
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2012
    Messages : 145
    Par défaut
    Ah, ça c'est excellent. Merci Diogène de nous indiquer (ou rappeler des choses comme ça. L'attribut const est un commentaire super utile pour tout développeur qui lit le code (en plus de ce que le compilateur peut en faire).

    Commentaire un peu hors-sujet:
    Le problème c'est que (des études le montrent, et un peu de raisonnement aussi), la quasi-totalité des paramètres de fonction proprement dits sont toujours inchangés, et ça n'aurait pas de sens de les changer de toute façon. (Ça va d'ailleurs bien avec le sens de "paramètre".) Le contre-exemple, c'est une une fonction (ou plutôt une action) dont le rôle est précisément de modifier ce sur quoi elle s'applique ; et dans ce cas-là cette variable n'est pas un paramètre. Par exemple, stocker dans un set un nouvel élément.
    Alors, ce qui serait utile, c'est d'inverser le standard pour mettre les paramètres const par défaut. Sinon, pour être cohérent, on devrait mettre const sur presque tous les paramètres, mais ça pollue complètement le code (et de toutes façon, on le sait qu'il sont presque tous const, logiquement).
    Par contre l'info inverse que tel paramètre (généralement le premier et lui seul), de ces fonctions spéciales qui sont en fait des actions, est une variable dynamique, ça ça serait une info utile. Qu'en pensez-vous ? (En plus, ça permet au compilo d'optimiser tranquille en passant en douce un pointeur même si nous on l'écrit pas comme ça.)

    Denis

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

Discussions similaires

  1. pointeur sur structures
    Par Seimaya dans le forum Débuter
    Réponses: 33
    Dernier message: 26/08/2007, 18h13
  2. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  3. pointeur sur structure
    Par julien.63 dans le forum C
    Réponses: 7
    Dernier message: 04/06/2007, 17h50
  4. problème pointeur sur structure
    Par lejohn dans le forum C
    Réponses: 9
    Dernier message: 01/05/2007, 13h17
  5. Réponses: 2
    Dernier message: 21/03/2007, 10h55

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