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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

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

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    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 éclairé
    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
    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
    Membre habitué
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

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

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    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 600
    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
    Membre habitué
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

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

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    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 confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    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 600
    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
    Membre habitué
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

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

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    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
    Membre habitué
    Homme Profil pro
    Ingénieur
    Inscrit en
    Mars 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

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

    Informations forums :
    Inscription : Mars 2016
    Messages : 10
    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...

+ 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