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 structure dans structure: besoin d'aide pour la manipulation


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut Pointeur de structure dans structure: besoin d'aide pour la manipulation
    Bonjour,

    Tout d'abord, petite précision, je développe avec Eclipse dans une VM avec Linux.

    Je viens d'utiliser un utilitaire pour transformer une dbc en un .h. Dans ce .h je me retrouve avec des structures que j'ai quelques difficultés à manipuler:

    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
     
    /**
     * Name:        HPCM_Status_2
     * Comment:     <<empty>>
     */
    static struct DBC_HPC_BB_V3_MSG_HPCM_Status_2 {
    	const uint32_t ID;
    	const uint8_t IDE;
    	const uint8_t DLC;
    	 const struct {
    		signal_positioned ExternalTemperature;
    	} getSig;
    	 struct __attribute__((packed)) DBC_HPC_BB_V3_MSG_HPCM_Status_2_getSigVal {
    		uint16_t ExternalTemperature	: 16;
    	} *getSigVal;
    } DBC_HPC_BB_V3_MSG_HPCM_Status_2 __attribute__((unused)) = {
    	.ID = 0x18FEF500,
    	.IDE = CAN_ID_EXT,
    	.DLC = 8,
    	.getSig  = {
    		.ExternalTemperature = {
    			.position = 24,
    			.attributes = &DBC_HPC_BB_V3_SIG_ExternalTemperature
    		}
    	},
    	.getSigVal = 0
    };
    Je souhaiterai changer la valeur de ExternalTemperature dans différentes fonctions mais tous mes essais echouent. Voici une de mes fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CANDATATYPES_InitHPCMStatus2Struct (struct DBC_HPC_BB_V3_MSG_HPCM_Status_2_getSigVal* HPCMStatus2Struct)
    {
    	HPCMStatus2Struct->ExternalTemperature	= 5;
    }
    Et voici le dernier essai que j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CANDATATYPES_InitHPCMStatus1Struct (&DBC_HPC_BB_V3_MSG_HPCM_Status_2.getSigVal);
    Lorsque j’exécute la fonction CANDATATYPES_InitHPCMStatus2Struct, HPCMStatus2Struct->ExternalTemperature prends bien la valeur 5, mais au retour, c'est DBC_HPC_BB_V3_MSG_HPCM_Status_2.getSigVal qui a la valeur 5 et non pas DBC_HPC_BB_V3_MSG_HPCM_Status_2.getSigVal->ExternalTemperature.

    Je m'arrache les cheveux depuis plusieurs heures maintenant, je ne sais pas par quel bout le prendre et comment le tourner pour y arriver.

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Avatar de exe2bin
    Profil pro
    Passionné de programmation
    Inscrit en
    Mars 2009
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Passionné de programmation

    Informations forums :
    Inscription : Mars 2009
    Messages : 537
    Points : 387
    Points
    387
    Billets dans le blog
    3
    Par défaut
    Salut , as-tu essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void CANDATATYPES_InitHPCMStatus2Struct (struct DBC_HPC_BB_V3_MSG_HPCM_Status_2_getSigVal* HPCMStatus2Struct)
    {
    	HPCMStatus2Struct->getSigVal.ExternalTemperature	= 5;
    }
    ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Ca ne peu pas passer car si je comprends bien (j'ai fait l'essai quand même, Eclipse me le refuse a l’écriture et ca plante a la compil), dans la déclaration de la structure de base DBC_HPC_BB_V3_MSG_HPCM_Status_2, *getSigVal est un pointeur de la structure DBC_HPC_BB_V3_MSG_HPCM_Status_2_getSigValm mais je ne sais pas comment y accéder.

    Ce que j'ai du mal a comprendre aussi, c'est le .getSigVal = 0!!

    Dites moi si je me trompe, mais la déclaration de la structure et son initialisation est bien faite par la partie en gras ci dessous:

    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
    static struct DBC_HPC_BB_V3_MSG_HPCM_Status_2 {
    	const uint32_t ID;
    	const uint8_t IDE;
    	const uint8_t DLC;
    	 const struct {
    		signal_positioned ExternalTemperature;
    	} getSig;
    	 struct __attribute__((packed)) DBC_HPC_BB_V3_MSG_HPCM_Status_2_getSigVal {
    		uint16_t ExternalTemperature	: 16;
    	} *getSigVal;
    } DBC_HPC_BB_V3_MSG_HPCM_Status_2 __attribute__((unused)) = {
    	.ID = 0x18FEF500,
    	.IDE = CAN_ID_EXT,
    	.DLC = 8,
    	.getSig  = {
    		.ExternalTemperature = {
    			.position = 24,
    			.attributes = &DBC_HPC_BB_V3_SIG_ExternalTemperature
    		}
    	},
    	.getSigVal = 0
    };

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    Ligne 15 getSigVal est indiqué comme pointeur. Il ne faut donc surtout pas de & dans l'appel
    CANDATATYPES_InitHPCMStatus1Struct (&DBC_HPC_BB_V3_MSG_HPCM_Status_2.getSigVal);.
    Le compilateur doit indiquer des warnings sur cette ligne, il suffit de les lire.

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    En effet, il fait un warning mais lorsque j’enlève le &, je n’ai plus de warning mais il plante carrément à l’execution de la commande qui écrit la température.

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    C'est normal qu'il plante, c'est un pointeur initialisé à 0 (ligne 21.)
    Un pointeur ça doit pointer quelque part, si tu n'as pas besoin de pointeur ôte l'étoile ligne 15 et remet le &.

  7. #7
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par dalfab Voir le message
    C'est normal qu'il plante, c'est un pointeur initialisé à 0 (ligne 21.)
    Un pointeur ça doit pointer quelque part, si tu n'as pas besoin de pointeur ôte l'étoile ligne 15 et remet le &.
    Je vais essayé en rentrant, merci.
    À la base je ne voulais pas trop toucher au fichier qui contient les déclarations car il est généré par un petit programme à partir d’une dbc, et je vais devoir le modifier à chaque fois que je le régénèrerais. Mais si c’est la seule solution...

    Je te tiens au courant quand j’ai fait le test.

  8. #8
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par dalfab Voir le message
    C'est normal qu'il plante, c'est un pointeur initialisé à 0 (ligne 21.)
    Un pointeur ça doit pointer quelque part, si tu n'as pas besoin de pointeur ôte l'étoile ligne 15 et remet le &.
    Alors, je viens de faire le test en modifiant la declaration comme suit:
    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
     
    static struct DBC_HPC_BB_V3_MSG_HPCM_Status_1 {
    	const uint32_t ID;
    	const uint8_t IDE;
    	const uint8_t DLC;
    	 const struct {
    		signal_positioned ParkBrakeStatus;
    	} getSig;
    	 struct __attribute__((packed)) DBC_HPC_BB_V3_MSG_HPCM_Status_1_getSigVal {
    		uint8_t ParkBrakeStatus	: 2;
    	} getSigVal;
    } DBC_HPC_BB_V3_MSG_HPCM_Status_1 __attribute__((unused)) = {
    	.ID = 0x18FEF100,
    	.IDE = CAN_ID_EXT,
    	.DLC = 1,
    	.getSig  = {
    		.ParkBrakeStatus = {
    			.position = 2,
    			.attributes = &DBC_HPC_BB_V3_SIG_ParkBrakeStatus
    		}
    	},
    	.getSigVal = {.ParkBrakeStatus = 0}
    et dans ce cas ça fonctionne. Merci!!

    Par contre ceci m'a obligé a modifier mon .h généré, et je dois donc faire cette modification pour une 20ene de structures qui sont plus lourdes a modifier. Certaines ont jusqu’à 10 paramètres. J'aimerais trouver la solution sans être obligé de modifier la declaration, mais je ne sais pas comment m'y prendre...

  9. #9
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Si getSigVal reste un pointeur initialisé à 0. C'est qu'il manque quelque part une fonction qui va le faire pointer là où il y a vraiment la donnée ou bien que la génération du .h est incomplète. Le fait que ça soit une structure packed fait penser à une référence directe à une adresse hardware, il doit manquer quelque chose.
    Sinon il faudrait initialiser tous ces pointeurs vers de la mémoire allouée, puis penser à les désallouer quand les structures ne sont utilisées.

  10. #10
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Citation Envoyé par dalfab Voir le message
    Le fait que ça soit une structure packed fait penser à une référence directe à une adresse hardware, il doit manquer quelque chose.
    Sinon il faudrait initialiser tous ces pointeurs vers de la mémoire allouée, puis penser à les désallouer quand les structures ne sont utilisées.
    __attribute__((packed)) n’est pas/ne fait pas référence au matériel, c’est une extension de votre compilateur qui ne fait pas partie du langage de programmation C; cela ordonne juste à votre compilateur d’effectuer quelques optimisations; plus précisément, cela demande au compilateur d’omettre tous les paddings (pas de bits de bourrage/de bits de remplissage) entre les membres d’une structure, union, énumération.
    Cependant, il faut faire très attention. L’utilisation de __attribute__((packed)) n’est pas forcément supporteur sur certaines architectures machine (telles que SPARC, IA64). Les instructions générées peuvent donner du mauvais code: exemple, des résultats erronés lors d’une lecture de la valeur d’un membre de la structure ou carrément un crash du programme dans les pires des cas.

    Les pointeurs sur des structures packed ne sont absolument pas du tout conseillés car le comportement est fatalement indéterminé (à moins que vous sachiez ce que vous faites ou aligner vous-même votre structure).

    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Modifier manuellement des fichiers générés n'est certainement pas la solution.
    Je suppose que tu n'es pas le seul à bosser sur ça et as des collègues. Il est temps d'aller les voir, en particulier les plus expérimentés qui connaissent mieux le système (ce qui devrait être la première étape face à un tel problème de toutes façons).
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Si getSigVal reste un pointeur initialisé à 0. C'est qu'il manque quelque part une fonction qui va le faire pointer là où il y a vraiment la donnée ou bien que la génération du .h est incomplète. Le fait que ça soit une structure packed fait penser à une référence directe à une adresse hardware, il doit manquer quelque chose.
    Sinon il faudrait initialiser tous ces pointeurs vers de la mémoire allouée, puis penser à les désallouer quand les structures ne sont utilisées.
    Merci, en effet c'est logique je suis passé à côté. Un malloc aurait été de mise...

    Citation Envoyé par sambia39 Voir le message
    Bonjour,


    __attribute__((packed)) n’est pas/ne fait pas référence au matériel, c’est une extension de votre compilateur qui ne fait pas partie du langage de programmation C; cela ordonne juste à votre compilateur d’effectuer quelques optimisations; plus précisément, cela demande au compilateur d’omettre tous les paddings (pas de bits de bourrage/de bits de remplissage) entre les membres d’une structure, union, énumération.
    Cependant, il faut faire très attention. L’utilisation de __attribute__((packed)) n’est pas forcément supporteur sur certaines architectures machine (telles que SPARC, IA64). Les instructions générées peuvent donner du mauvais code: exemple, des résultats erronés lors d’une lecture de la valeur d’un membre de la structure ou carrément un crash du programme dans les pires des cas.

    Les pointeurs sur des structures packed ne sont absolument pas du tout conseillés car le comportement est fatalement indéterminé (à moins que vous sachiez ce que vous faites ou aligner vous-même votre structure).

    à bientôt
    Ok, donc en fait mon .h généré n'est pas des plus simple a utilisé, ni des plus sécuritaire au niveau du comportement des structures à cause de __attribute__((packed)).


    Citation Envoyé par Bousk Voir le message
    Modifier manuellement des fichiers générés n'est certainement pas la solution.
    Je suppose que tu n'es pas le seul à bosser sur ça et as des collègues. Il est temps d'aller les voir, en particulier les plus expérimentés qui connaissent mieux le système (ce qui devrait être la première étape face à un tel problème de toutes façons).
    En fait, il y a quelques temps, j'ai créé une dbc et créer les fichies C et H pour l'utiliser dans un code. A ce moment là, plusieurs personnes au boulot m'ont dit: tu t'es embêté pour rien car il existe des logiciels qui transforme ta dbc pour que tu puisse l'exploiter en C. Maintenant que cette dbc a été complètement modifiée, me revoila avec une integration a refaire dans mon code. Le pb et que j'ai fait le tour des collègues qui m'ont parlé des outils la 1ere fois et que soit ces outils sont pour du pyton, soit ils ont juste entendu parlé d'outil pour le C mais jamais personne n'en a utilisé...

    D'ailleurs si quelqu'un au final connait un outil de "convertion" de .dbc en quelque chose d'exploitable en C, je suis plus que preneur. Car au final j'ai perdu plus de temps aue si j'avais mis a jour mes fichiers a la main...

  13. #13
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Je n'ai jamais utilisé ce format, mais ceci ne correspond pas ? https://github.com/howerj/dbcc
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  14. #14
    Candidat au Club
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Je n'ai jamais utilisé ce format, mais ceci ne correspond pas ? https://github.com/howerj/dbcc
    Bonjour,

    oui j'ai vu ce programme lors de mes recherche et je ne l'avais pas pris car il y avait ceci de mentionné:

    The generated C code has not been tested that much (it is probably incorrect!)

    Mais vu que celui que j'ai utilisé est dangereux, pour l'instant je vais modifier le fichier et si plus tard il y a de nouvelles modifications de cette dbc je les ferais à la main. Et je regarderais sur quoi me baser pour avoir un générateur perso....

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

Discussions similaires

  1. Besoin d'aide pour structuration particulière
    Par ThierryForum dans le forum Langage SQL
    Réponses: 1
    Dernier message: 30/06/2013, 16h20
  2. besoin d'aide pour la structure DCB & COMSTAT
    Par PIC16F877A dans le forum C
    Réponses: 4
    Dernier message: 24/06/2011, 07h22
  3. [PHP 5.3] Besoin d'aide pour la manipulation des array
    Par pierrot10 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2011, 23h26
  4. Besoin d'aide pour structure de tables avec Mysql
    Par alsab dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/12/2010, 16h54
  5. Besoin d'aide pour les structures de données dynamiques
    Par aurelie689 dans le forum Pascal
    Réponses: 3
    Dernier message: 26/12/2007, 21h29

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