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 :

Duplication de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut Duplication de structure
    Bonjour,

    Je cherche a dupliquer une structure qui ressemble a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef struct TEST{
         /* Methodes */
         int (*Read) (int parm1, int param2);
     
         /* Donnees */
         void* zone_mem;
         char* name;
         int value
    } Parametres;
    Je me suis cree une fonction qui permet de dupliquer une instance de cette structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Parametres* DuplicateParametres(Parametres* params){
     
    Parametres* new_parametres = (Parametres*)malloc(sizeof(Parametres));
     
    memcpy(new_parametres,params,sizeof(Parametres));
     
    new_parametres->name = strdup(params->name)
     
    return new_parametres;
    }
    Mon problème est que je ne sait pas bien me servir des pointeurs de fonctions,
    je ne sait pas comment c'est géré en mémoire.
    Je me demande donc si mon memcpy de la structure duplique également les pointeurs sur fonction (en l'occurence Read).

    Mon deuxieme probleme est comment dupliquer la zone_memoire declarer en void*. Cette variable est un pointeur vers une zone memoire dependant du type de parametre cree et peut donc etre de differentes tailles.
    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
    En l'occurrence, oui, le pointeur de fonction est dupliqué aussi.
    Évidemment, la fonction elle-même ne l'est pas.

    PS: Le cast de malloc() est inutile en C.
    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
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut
    Merci pour ta reponse c'est bien ce que je pensai mais je n'en etai pas sur.
    J'ai edité mon post pour rajouter ma deuxieme problematique que j'avai oubliée

  4. #4
    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
    Eh bien si tu veux la dupliquer, il faut joindre sa taille.
    Si tu ne veux pas la dupliquer ni que la structure gère sa durée de vie, tu peux bêtement copier le pointeur.
    Si tu ne veux pas la dupliquer mais tu veux que la structure gère son temps de vie, tu dois faire un comptage de références. Un comptage non-intrusif, si j'ai bien compris...
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 53
    Par défaut
    Merci pour vos reponses. Le meilleur moyen pour moi serai de transporter dans la structure la taille de la zone memoire pointee par zone_memoire mais helas je ne peut pas me permettre de modifier la structure en question. Je vais donc me contenter de copier le pointeur vers la zone en indiquant bien que la methode ne duplique pas cette zone memoire.

    Merci.

  6. #6
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par alaparra Voir le message
    Merci pour ta reponse c'est bien ce que je pensai mais je n'en etai pas sur.
    J'ai edité mon post pour rajouter ma deuxieme problematique que j'avai oubliée
    En principe, il te suffit d'utiliser memcpy() pour cela, mais tu dois connaître la taille de l'espace mémoire pointé par zone mem. Pour cela, je modifierais un peut ta structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    typedef struct TEST{
         /* Methodes */
         int (*Read) (int parm1, int param2);
     
         /* Donnees */
         struct
         {
              void *p;
              size_t size;
         }
         zone_mem;
         char* name;
         int value
    } Parametres;
    Ensuite, pour la duplication, il suffit d'écrire quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    new_parametres->zone_mem.p = malloc(params->zone_mem.size);
    if (new_parametres->zone_mem.p != NULL)
    {
        memcpy(new_parametres->zone_mem.p, params->zone_mem.p, 
                    params->zone_mem.size);
    }
    else
    {
         /* Erreur d'allocation: on fait le menage */
         free(new_parametres->name);
         free(new_parametres), new_parametres = NULL;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par alaparra Voir le message
    Mon problème est que je ne sait pas bien me servir des pointeurs de fonctions,
    je ne sait pas comment c'est géré en mémoire.
    Je me demande donc si mon memcpy de la structure duplique également les pointeurs sur fonction (en l'occurence Read).
    Merci.
    Un pointeur de fonction ne contient rien d'autre que l'adresse mémoire d'une fonction. Cette adresse est bien copiée par memcpy() et je ne vois à priori pas de problème dans ton code.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

Discussions similaires

  1. recuperation de la structure d'une base
    Par pascalT dans le forum 4D
    Réponses: 7
    Dernier message: 07/06/2006, 15h32
  2. Duplication de structures en C++
    Par anisb dans le forum C++
    Réponses: 2
    Dernier message: 10/10/2005, 12h08
  3. Message 'Duplicate index entry'
    Par Poulou dans le forum Administration
    Réponses: 13
    Dernier message: 04/05/2004, 14h57
  4. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 18h31

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