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 les éléments d'une structure


Sujet :

C

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut Pointeur sur les éléments d'une structure
    salut à tous et à toutes ;


    Tout est dans le titre , j'ai une structure Marley_t et je souhaite y accéder aux éléments de cette structure .


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct mastructure_s
    {
     int  x, y, A,B,C,D,E;
     
    }Marley_t;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    int fonction ( void)
     
    {
     
    Marley_t  *pointeur; // je créer un pointeur pour ma structure 
     
     
     BN_set_bit(pointeur->x,64); // ensuite j'essaye de pointer vers x 
     BN_mod_inverse(pointeur->J,pointeur->J,pointeur->y);
     BN_set_bit(pointeur->J,pointeur->x);
     
     
    }

    Lorsque je compile :
    <function argument>: implicit cast of non-0 int to pointer


    Par contre en utilisant un this ça marche sans probléme .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    int fonction ( Marley_t * this ) 
     
    {
     
     BN_set_bit( &this->x,64); // ensuite j'essaye de pointer vers x 
     BN_mod_inverse(&this->J, &this->J, &this->y);
     BN_set_bit(&this->J, &this->A, &this->x);
     
     
    }


    Lorsque je compile : - 0 error(s), 0 warning(s)

    Merci d'apporter vos différents conseils et suggéstions par rapport à l'utilisation d'un this pour pointer vers les éléments d'une structure .

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    Tout est dans le titre , j'ai une structure Marley_t et je souhaite y accéder aux éléments de cette structure .
    <...>
    Merci d'apporter vos différents conseils et suggéstions par rapport à l'utilisation d'un this pour pointer vers les éléments d'une structure .
    this est un identificateur comme un autre en C. Il n'a pas de propriétés particulières.

    Le premier code est faux pour de nombreuses raisons, la plus évidente est que le pointeur n'est pas initialisé. Ensuite, dans le 2 cas, il n'y a pas de membre nommé J...

    Il faut le passer en paramètre et utiliser la même syntaxe qu'avec this (seul le nom du pointeur change).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int fonction (Marley_t * pointeur)
    {
       BN_set_bit (&pointeur->x, 64); // ensuite j'essaye de pointer vers x
       BN_mod_inverse (&pointeur->x, &pointeur->A, &pointeur->y);
       BN_set_bit (&pointeur->A, &pointeur->x);
    }
    (j'ai mis A au pif, à la place de J qui n'existe pas).

  3. #3
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    BN_set_bit( &this->x,64);
    Puisque pas d'erreur => la fonction BN_set_bit, attend un pointeur comme premier argument, or dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int fonction ( void)
    {
    Marley_t  *pointeur; // je créer un pointeur pour ma structure 
     BN_set_bit(pointeur->x,64); // ensuite j'essaye de pointer vers x
    on lui donne un entier comme argument! pointeur->x n'est pas un pointeur mais la valeur du champ x de la structure (un int).

    idem pour BN_mod_inverse

    A noter : dans cette fonction pointeur n'est pas initialisé.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    this est un identificateur comme un autre en C. Il n'a pas de propriétés particulières.

    Le premier code est faux pour de nombreuses raisons, la plus évidente est que le pointeur n'est pas initialisé. Ensuite, dans le 2 cas, il n'y a pas de membre nommé J...

    Il faut le passer en paramètre et utiliser la même syntaxe qu'avec this (seul le nom du pointeur change).

    en cours ...


    bonjour Emmanuel Delahaye ;


    J'ai pris en considération tout ce que vous m'avez dit et voici le nouveau code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct mastructure_s
    {
     int  x, y, A,B,C,D,E, J ;
     
    }Marley_t;


    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
     
    int fonction ( void)
     
    {
     
     
    Marley_t   *pointeur;    // Pointeur vers structure Marley_t
    pointeur = &Marley_t;   // j'initialise le pointeur vers la structure  
     
     
     BN_set_bit(pointeur->x,64); // ensuite j'essaye de pointer vers x 
     BN_mod_inverse(pointeur->J,pointeur->J,pointeur->y);
     BN_set_bit(pointeur->J,pointeur->x);
     
     
    }

  5. #5
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct mastructure_s
    {
     int  x, y, A,B,C,D,E, J ;
     
    }Marley_t;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int fonction ( void)
    {
    Marley_t   *pointeur;    // Pointeur vers structure Marley_t
    pointeur = &Marley_t;   // j'initialise le pointeur vers la structure  
     
     
     BN_set_bit(pointeur->x,64); // ensuite j'essaye de pointer vers x 
     BN_mod_inverse(pointeur->J,pointeur->J,pointeur->y);
     BN_set_bit(pointeur->J,pointeur->x);
     
    }
    et c'est toujours faux, car ton pointeur ne pointe pas sur une structure, mais sur un pointeur qui est du type Marley_t *, mais pas sur une variable...

    Ton typedef ne definit pas une varaible, mais une structure...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int fonction ( void)
    {
    Marley_t   *pointeur, MaStruct;    // Pointeur vers structure Marley_t
    pointeur = &MaStruct;   // j'initialise le pointeur vers la structure  
     
     
     BN_set_bit(pointeur->x,64); // ensuite j'essaye de pointer vers x 
     BN_mod_inverse(pointeur->J,pointeur->J,pointeur->y);
     BN_set_bit(pointeur->J,pointeur->x);
     
    }

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    J'ai pris en considération tout ce que vous m'avez dit et voici le nouveau code
    <...>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int fonction ( void)
    {
       Marley_t   *pointeur;    // Pointeur vers structure Marley_t
       pointeur = &Marley_t;   // j'initialise le pointeur vers la structure
    T'as appris le C en lisant les blagues Caram'bar ? Sans dec' tu crois que prendre l'adresse d'un type, ça a un sens quelconque ? Faut arrêter la fumette... Le C c'est pas pour les bricoleurs. Ca s'apprend et il faut du temps et beaucoup de pratique.

    Il y a des références de tutoriels et de livres sur ce site (et le mien).

  7. #7
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Merci à vous tous Emmanuel , souviron34 , diogene je vais voir si j'ai plus d'erreurs lorsque je compile .

    http://bien-programmer.blogspot.com/
    http://emmanuel-delahaye.developpez.com/

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    RE -

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typedef struct Marley_s
    {
     int x,y, A ;
     
    }Marley_t;
     
     
    Marley_t *ptr;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int fonction (Marley_t * ptr)
    {
     
       BN_mod_inverse (&ptr->x, &ptr->A, &ptr->y);
     
    }
    0 error(s), 0 warning(s)

    Suite aux différents conseils ce code au dessus est CORRECT est sans erreurs


    La Quéstion :
    Y'a t'il une autre méthode pour accéder aux éléments de la structure à part un this ?

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    Suite aux différents conseils ce code au dessus est CORRECT est sans erreurs

    La Quéstion :
    Y'a t'il une autre méthode pour accéder aux éléments de la structure à part un this ?
    C'est quoi un 'this' pour toi ? Je n'en vois pas dans ce code.

    Ce qui m'inquiète, c'est de voir un pointeur non initialisé, mais bon, on a pas tout le code...

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Emmanuel Delahaye ;


    La Stucture Marley_t

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    typedef struct
    {
     
    }Marley_t;

    Les Variables de la structure :


    Le pointeur vers la structure :

    Marley_t * p;


    La fonction incluant le pointeur vers la structure Marley_t :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int fonction (Marley_t * p)
    {
     
     
    }
    Fonctions de la bibliothéque BiGNumbers Library qui prends 3 paramétres dans la fonction .

    Utilisation de la fonction BN_mod_inverse avec 3 paramétres dans la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BN_mod_inverse (&p->x, &p->y, &->A);

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    Comme dit précédemment, ton pointeur n'a pas l'air initialisé, de plus, tu as l'air de le déclarer en tant que variable globale (et c'est mal).

    Reprenons, tu as ta structure

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct
    {
      int	x;
      int	y;
      int	A;
    } Marley_t;
    Dans une fonction en amont de celle que tu appelles fonction(), tu dois, je pense créer une variable qui est de type Marley_t.

    Cela se déclare de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Marley_t	var;
    /* + initialisation des elements de la structure, sans doute */
    ou bien,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Marley_t	*ptr;
     
    if ((ptr = malloc(1 * sizeof(*ptr))) == NULL)
    	return (-1); /* Par exemple */
    /* + initialisation des elements de la structure, sans doute */
    Ensuite tu passes cette variable a ta fonction fonction() :

    Prototypée visiblement de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int	fonction (Marley_t *p);
    Tu lui passes (à partir de la fonction en amont) un pointeur sur une structure Marley_t.

    Si tu as déclaré ta structure "en dur", tu lui passes comme ceci (avec retour un entier déclaré au préalable) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = fonction(&var);
    ou bien si tu as déclaré un pointeur (ou par exemple si ta structure a été déclarée plus haut dans ton code), comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    retour = fonction(ptr);
    Ensuite, le passage a la fonction BN_mod_inverse (int *, int *, int *) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int	fonction (Marley_t *ptr)
    {
      BN_mod_inverse (&ptr->x, &ptr->y, &ptr->A);
      return (0);
    }
    Voila (c).

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Tusbar , Trés Bonne idée .

    C'est intéressant parceque si on utilise 150 fonctions il suffit d'ajouter dans les paramétres de la fonctions le pointeur de la structure Marley_t .

    Illustration :


    Une structure :


    typdef struct

    {

    int A, B,C ;

    }Marley_t;

    Marley_t *p;


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void fonction1 (Marley_t  *p)
     
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void fonction2 (Marley_t  *p)
     
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fonction3 (Marley_t  *p)
    
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fonction4 (Marley_t  *p)
    
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fonction5 (Marley_t  *p)
    
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fonction6 (Marley_t  *p)
    
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fonction7 (Marley_t  *p)
    
    {
    BN_mod_inverse (&A->x, &->B, &ptr->C);
    }


    Ca m'as l'air beaucoup plus simple comme ça , et le code est plus présentable comme disait Emmanuel DelaHaye .

  13. #13
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    Ca m'as l'air beaucoup plus simple comme ça
    Euh, c'est quoi l'intérêt de recopier 7 fois le même code ?

  14. #14
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 94
    Points : 34
    Points
    34
    Par défaut
    Bonsoir Emmanuel Delahaye ,

    Il éxiste des projets en langage C qui comporte plus de 50 fonctions
    Emmanuel .

    Dans l'exemple dont vous parler , j'ai illustrer par un Copier Coller des 7 fonctions pour dire qu'on pourras utiliser autant de fonctions qu'on veut dans un projet en C et suffit d'y ajouter
    le pointeur de la structure dans chaque fonction ajouter .


    Je pourrais peu étre me tromper , mais c'est à vous de me corriger si je me trompe Emmanuel DelaHaye .

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    au risque de me repeter, ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    typdef struct 
    {
     
    int A, B,C ;
     
    }Marley_t;
     
    Marley_t *p;
    ne defini pas une structure....

    Mais une variable de type "pointeur sur une structure de type Marley_t"..


    Ce qui ne t'avance pas beaucoup, tant que tu n'as pas de variable sur laquelle pointer...

    Donc, soit tu fais de l'allocation dynamique, soit statique, mais dans ce cas il faut alors le preciser :

    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    p = malloc ( sizeof(Marley_t) );
    soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Marley_t MaStruct ;
    Marley_t *p = &MaStruct ;
    Et pour ce qui est de tes 7 exemples, c'est pas complique, c'est le principe meme des pointeurs.

    Comme dis Emmanuel, tu ouvrirais un livre de C au lieu du hasard, ca marcherait mieux...

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Marley_T Voir le message
    Il éxiste des projets en langage C qui comporte plus de 50 fonctions
    Oui, les projets industriels sur lesquels j'ai travaillé pendant 17 ans comportaient des dizaines de blocs fonctionnels, des centaines de fichiers milliers de fonctions et des millions de lignes de code...
    Dans l'exemple dont vous parler , j'ai illustrer par un Copier Coller des 7 fonctions pour dire qu'on pourras utiliser autant de fonctions qu'on veut dans un projet en C et suffit d'y ajouter
    le pointeur de la structure dans chaque fonction ajouter .
    2 fonctions auraient suffit pour illustrer le propos...

    Je te conseille de lire ceci, ça devrait concrétiser ta pensée bouillonnante :

    http://emmanuel-delahaye.developpez.com/tad.htm

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Je te conseille de lire ceci, ça devrait concrétiser ta pensée bouillonnante :

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/08/2011, 17h43
  2. Pointeur sur un élément d'une liste
    Par azerty25 dans le forum Général Python
    Réponses: 3
    Dernier message: 18/11/2007, 12h44
  3. Travail sur les éléments d'une matrice.
    Par Jefeh dans le forum MATLAB
    Réponses: 6
    Dernier message: 12/11/2007, 15h10
  4. Réponses: 1
    Dernier message: 09/05/2007, 15h58
  5. Réponses: 2
    Dernier message: 06/05/2007, 12h52

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