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 de struct mal interprété


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut Pointeur de struct mal interprété
    Bonjour,

    J'utilise la struct suivante :
    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
     
    typedef struct
    {
        unsigned char    t;
        int             a;
        int             b;
        unsigned char   e;
        unsigned char   f;
        unsigned char   g;
    } t_montype;
    .../...
    void FonctionAppellee(t_montype *m)
    {
        ..../....
    }
     
    void FonctionAppelante()
    {
        t_montype     p;
     
        // initialise les champs de p
        .../...
        // appelle FonctionAppellee
        FonctionAppellee(&p);

    En fait, quand on regarde le contenu de la strcuture p AVANT l'appel, il est OK.
    Quand on est dans FonctionAppellee, il n'est pas bon (mais la mémoire est OK). En fait, il semble que gcc ne voit pas la structure de la même manière... la mémoire est bonne, mais les m->e, m->a ... ne sont pas bons
    Quand on sort de l'appel, il est OK à nouveau

    Si je déplace les 3 unsigned char e, f, g après t, le problème disparaît

    C'est très embêtant de devoir "penser" à aligner les structs, normalement, le compilateur nos décharge de ce travail.

    Y'aurait-il une option de compilation qui perturberait ou qui manquerait ?

    Merci

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tout est dans le même fichier source?

    Et est-ce que le problème se manifeste hors du debugger?
    Genre, que se passe-t-il si tu fais une fonction void afficher_montype(t_montype const *) qui dumpe le contenu de l'objet sur la sortie standard?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    C'est curieux,
    on dirait que la gestion de l'alignement ne se fait pas.
    Il n'y aurait pas juste avant la définition de la struct une directive du type #pragma align ?
    Quel est le compilateur que tu utilises?

  4. #4
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut
    Citation Envoyé par dalfab Voir le message
    C'est curieux,
    on dirait que la gestion de l'alignement ne se fait pas.
    Il n'y aurait pas juste avant la définition de la struct une directive du type #pragma align ?
    Quel est le compilateur que tu utilises?
    C'est du gcc sous Linux et je n'ai pas de directives pragma.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour

    En l'êtat on ne peut pas dire ce qui se passe. Il faudrait un code complet reproduisant le souci.

    A titre d'exemple j'ai écrit ce test...
    Code c : 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
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>
     
    typedef struct {
    	unsigned char	t;
    	int		a;
    	int		b;
    	unsigned char	e;
    	unsigned char	f;
    	unsigned char	g;
    } t_montype;
     
    void FonctionAppellee(t_montype *m) {
    	printf("t=%c\n", m->t);
    	printf("a=%d\n", m->a);
    	printf("b=%d\n", m->b);
    	printf("e=%c\n", m->e);
    	printf("f=%c\n", m->f);
    	printf("g=%c\n", m->g);
    }
     
    void FonctionAppelante() {
    	t_montype	 p;
     
    	// initialise les champs de p
    	p.t='t';
    	p.a=542;
    	p.b=817;
    	p.e='e';
    	p.f='f';
    	p.g='g';
     
    	// appelle FonctionAppellee
    	FonctionAppellee(&p);
    }
     
    int main() {
    	FonctionAppelante();
    }
    ... qui a donné le résultat attendu (et compilé avec gcc sous Linux)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bonjour

    En l'êtat on ne peut pas dire ce qui se passe. Il faudrait un code complet reproduisant le souci.

    A titre d'exemple j'ai écrit ce test...
    Code c : 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
    31
    32
    33
    34
    35
    36
    37
    38
    #include <stdio.h>
     
    typedef struct {
    	unsigned char	t;
    	int		a;
    	int		b;
    	unsigned char	e;
    	unsigned char	f;
    	unsigned char	g;
    } t_montype;
     
    void FonctionAppellee(t_montype *m) {
    	printf("t=%c\n", m->t);
    	printf("a=%d\n", m->a);
    	printf("b=%d\n", m->b);
    	printf("e=%c\n", m->e);
    	printf("f=%c\n", m->f);
    	printf("g=%c\n", m->g);
    }
     
    void FonctionAppelante() {
    	t_montype	 p;
     
    	// initialise les champs de p
    	p.t='t';
    	p.a=542;
    	p.b=817;
    	p.e='e';
    	p.f='f';
    	p.g='g';
     
    	// appelle FonctionAppellee
    	FonctionAppellee(&p);
    }
     
    int main() {
    	FonctionAppelante();
    }
    ... qui a donné le résultat attendu (et compilé avec gcc sous Linux)
    Oui, je l'ai essayé aussi
    le problème du code complet, c'est qu'il est énorme. Et il embarque des lib externes qui obligent, par exemple, à des options de type -fPIC -no-pie et du coup, c'est compliqué à fournir ici

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 634
    Par défaut Question
    Bonjour,

    C'est possible d'avoir les valeurs initialisées et les valeurs erronées des différents champs (si ces dernières sont stables) ?

    Salutations

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Vu que tes fonctions ne sont pas dans le même source, vérifie qu'elles voient toutes les deux la même déclaration.

    Rajoute dans les deux fonctions des printf("%zu\n", offsetof(t_montype, f));
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut
    Citation Envoyé par Guesset Voir le message
    Bonjour,

    C'est possible d'avoir les valeurs initialisées et les valeurs erronées des différents champs (si ces dernières sont stables) ?

    Salutations
    elles sont stables. Je veux dire que, à chaque exécution, on a les mêmes défauts, les mêmes valeurs fausses.
    et quand je déplace mes 3 unsigned char de la fin de la struct après le 1er champs, tout se passe bien

    Merci de ta contribution

  10. #10
    Membre averti
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 23
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Tout est dans le même fichier source?

    Et est-ce que le problème se manifeste hors du debugger?
    Genre, que se passe-t-il si tu fais une fonction void afficher_montype(t_montype const *) qui dumpe le contenu de l'objet sur la sortie standard?
    Le problème n'est pas lié au debogueur. Avec des printf, c'est pareil

    En fait, la fonction appelée et la fonction appelante ne sont pas dans le même source.

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

Discussions similaires

  1. [HTML] caracteres speciaux mal interprété
    Par xclam dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 24/05/2007, 17h47
  2. type de variable mal interprêté
    Par hisy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/04/2007, 11h09
  3. Servlet mal interprétée
    Par Séb@s dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 01/12/2006, 14h52
  4. Pb pointeur tableau struct
    Par difficiledetrouver1pseudo dans le forum C
    Réponses: 12
    Dernier message: 02/05/2006, 15h48
  5. Réponses: 4
    Dernier message: 29/06/2005, 11h40

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