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 :

Comparaison de structures : méthode miracle ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut Comparaison de structures : méthode miracle ?
    Bonjour,

    J'ai des structures à comparer.
    Pour comparer une structure, on est donc normalement obligé de créer une fonction qui compare chaque champs un à un pour éviter les problèmes de padding :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    BOOL compareMyStruct(MY_STRUCT * struct1, MY_STRUCT * struct2){
    	if(
    		(struct1->elm1 != struct2->elm1) ||
    		(struct1->elm2 != struct2->elm2) ||
    		// ..
    		(struct1->elmX != struct2->elmX)	
    	){
    		return FALSE;
    	}
     
    	return TRUE;
    }
    Y a t-il une petite astuce pour que si j'ajoute un membre dans la structure, qu'il y ai une erreur/warning à la compilation si j'oublie de modifier la fonction compareMyStruct() en conséquence ?

    => Je cherche une méthode fiable pour éviter tout oubli

    Merci d'avance

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Non.

    Mais si la déclaration de la fonction est à coté de la définition de la structure, une paire de commentaire bien placés devraient aider.

    C'est la première étape de "documenter et spécifier".

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Le problème des commentaires, c'est que quand tu dois rendres un projet rapidement et que l'on te met la pression, tu as vite fait de ne pas lire les commentaires alors qu'avec un bon gros #error, ça c'est imparable... mais bon s'il n'y a pas le choix, allons y pour les commentaires

    merci

  4. #4
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    Pourquoi un memcmp ne marcherais pas?

  5. #5
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Citation Envoyé par mith06 Voir le message
    Pourquoi un memcmp ne marcherais pas?
    Le compilateur peut ajouter des octets de padding et je pense (à vérifier) que ces octets ont une valeur indéterminé.

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Le compilateur peut ajouter des octets de padding et je pense (à vérifier) que ces octets ont une valeur indéterminé.
    On doit pouvoir empécher cela avec les indications pour le compilateur lié au packing des structures.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    Citation Envoyé par mith06 Voir le message
    Pourquoi un memcmp ne marcherais pas?
    Ce que j'ai remarqué dans la déclaration d'une structure (je ne sais pas si c'est vrai dans tous les cas) :
    1- les variables sont placées dans l'ordre de leur déclaration.
    2- les variables sont placées à des adresses qui sont divisibles par la taille de la variable.
    3- la taille totale de la structure est divisible par la taille de la plus grosse variable

    Ex
    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
     
    typedef struct {
        UINT8 val8bits;
        UINT32 val32bits;
        UINT16 val16bits;
        UINT8 val8bits_2;
    } MY_STRUCT;
     
    void main(void){
        MY_STRUCT myStruct;
     
        myStruct.val8bits = 1;
        myStruct.val32bits = 2;
        myStruct.val16bits = 3;
        myStruct.val8bits_2 = 4;
     
        printf("sizeof(myStruct) = %i\r\n", sizeof(myStruct));
        printf("offset @myStruct.val8bits = 0\r\n");
        printf("offset @myStruct.val32bits = %i\r\n", (unsigned int)&myStruct.val32bits - (unsigned int)&myStruct.val8bits);
        printf("offset @myStruct.val16bits = %i\r\n", (unsigned int)&myStruct.val16bits - (unsigned int)&myStruct.val8bits);
        printf("offset @myStruct.val8bits_2 = %i\r\n", (unsigned int)&myStruct.val8bits_2 - (unsigned int)&myStruct.val8bits);
    }
    Si myStruct.val8bits est à l'adresse 0, myStruct.val32bits sera donc à l'adresse 4 (4 correspond à 8 octets = 32bits), myStruct.val16bits à l'adresse 8 et myStruct.val8bits_2 à l'adresse 10.
    Il y a 3 octets de padding entre myStruct.val8bits et myStruct.val32bits et 1 octets de padding après myStruct.val8bits_2.
    => la taille de la structure sera donc de 12 octets

    Lorsqu'une variable est déclarée en locale comme dans le cas cité précédemment (variable temporaire), elle est mise sur la pile et les champs ne sont pas initialisés à la déclaration de la variable. Les valeurs des octets de padding dépendent donc des valeurs des anciennes variables qui était précédemment au même endroit dans la pile.
    Par contre les variables qui sont déclarées en extern/static (variables permanentes) ont tous leur octets qui sont initialisés à 0 au lancement du programme : je suppose donc qu'un memcmp sur deux structures en static doit fonctionner (à condition de ne pas avoir fait un memcpy avec une structure non static/extern pour modifier les valeurs de ces structures).


    Si on change l'ordre des variables de la structure comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct {
        UINT8 val8bits;
        UINT8 val8bits_2;
        UINT16 val16bits;
        UINT32 val32bits;
    } MY_STRUCT;
    => la taille de la structure sera de 8 octets et il n'y aura pas d'octets de padding

    Attention : comme je l'ai dit précédemment, je ne suis pas sure que ça soit vrai dans tous les cas (je ne connais pas bien la norme du C).

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 966
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 966
    Par défaut
    Voe,
    Citation Envoyé par boboss123 Voir le message
    Le problème des commentaires, c'est que quand tu dois rendres un projet rapidement et que l'on te met la pression, tu as vite fait de ne pas lire les commentaires alors qu'avec un bon gros #error, ça c'est imparable... mais bon s'il n'y a pas le choix, allons y pour les commentaires

    merci
    Faut pas pousser, quelques mots bien placés, en plus sur un programme que tu développes !!

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

Discussions similaires

  1. Comparaison de structures avec tableau ?
    Par Nikolas dans le forum C++
    Réponses: 26
    Dernier message: 01/11/2010, 17h06
  2. comparaison de structures
    Par Monstros Velu dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 13/06/2008, 13h51
  3. [BDS2006Win32] Comparaison de structure record
    Par edrin17 dans le forum Débuter
    Réponses: 6
    Dernier message: 24/08/2007, 19h09
  4. Comparaison sur structure
    Par HaTnuX dans le forum C
    Réponses: 4
    Dernier message: 05/12/2006, 13h48
  5. Comparaison de structure de deux tables
    Par Ryan Sheckler dans le forum Outils
    Réponses: 7
    Dernier message: 15/02/2006, 22h00

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