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 :

Comment copier une structure?


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Comment copier une structure?
    Bonjour, Je voudrai effectuer une copie d'une structure qui contient elle même une 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    struct vext 
    {
        void **vecteur;
        unsigned int taille_physique;
        unsigned int taille_rallongement;
        unsigned int nombre_d_elements;
        void (*liberer)(void *);
        void (*afficher)(void *);
    };
     
    struct tas
    {
      vext vecteur;
      int dernier_element;
      int (*comparaison) (void *, void *);
      void (*liberer)(void *);
      void (*afficher)(void *);
      bool inverser;
    };
     
    tas
    tas_creer(fonction_comparer f)
    {
      tas self = memoire_allouer(sizeof(struct tas));
     
      self->vecteur = vext_creer();
      self->comparaison = f;
      self->dernier_element= -1;
      self->liberer = NULL;
      self->afficher = afficher_chaine;
      self->inverser = false;
     
     
      return self;
    }
     
     
    void
    tas_afficher(tas self)
    {
      tas bob= tas_creer(self->comparaison);
     
      //peut on copier comme ca?
      bob = self;
     
      // ou comme ca?
      bob->vecteur = self->vecteur;
      bob->dernier_element = self->dernier_element;
      bob->liberer = self->liberer;
      bob->afficher = self->afficher;
      bob->inverser = self->inverser;
    Je compile dans les deux cas sans erreur mais je pense que c'est à cause de ca que mon programme ne marche pas. Car peu être tout les champs ne se copie pas bien.

    Quelle est la bonne méthode pour copier une structure?

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pauligno Voir le message
    Bonjour, Je voudrai effectuer une copie d'une structure qui contient elle même une structure.
    <...>
    Quelle est la bonne méthode pour copier une structure?
    Déjà, est-tu sûr qu'il faille copier une structure ? C'est plutôt rare comme manip... est-ce bien justifié ? Ca sent l'erreur de conception à plein nez...

    Si tu y tiens :

    Pour une structure simple, on utilise l'affectation directe =.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    {
       struct x a;
       struct x b;
     
       b = a;
    }
    sous réserve d'une initialisation correcte, bien sûr...

    Si il y a des pointeurs de données, on fait la copie comme précédemment, mais les données pointées doivent être copiées dynamiquement (malloc(), copie...), et leurs adresses stockées dans les nouveaux pointeurs.

    Mais c'est une opération plutôt complexe qui se justifie rarement...

    Là encore, est-ce bien nécessaire (j'insiste...)

    D'autre part, dans les structures, j'ai vu des pointeurs de fonctions. S'agit-il de 'singer' le C++, auquel cas, c'est inutile, ou bien s'agit-il de véritables points de sorties dynamiques (callbacks) ?
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Il s'agit d'un tas implémenté par un vecteur qui grandit dynamiquement en cas de besoin.

    Pour information c'est un devoir que fait pour deuxième année d'informatique.
    Grâce à ce tas on pourra utiliser une fonction trier qui enverra les données dans l'ordre.

    Pour renvoyer les données dans l'ordre on a une fonction renvoyer_valeur() qui
    -renvoi le sommet du tas
    -le supprime
    -et réorganise le tas

    ainsi on a toujours la valeur la plus grande qui sort en premier puis ainsi de suite
    Mais cela détruit mon tas alors que je ne veut que l'afficher!
    Donc c'est pour cela que j'ai pensé a copier le tas.
    Mon raisonnement est il faux?

    Cependant comme tu le dis j'ai aussi des pointeurs sur données.
    Je pourrai avoir un exemple de ce type de copie?

    Merci d'avance

  4. #4
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par pauligno Voir le message
    Cependant comme tu le dis j'ai aussi des pointeurs sur données.
    Je pourrai avoir un exemple de ce type de copie?
    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
    28
    29
    30
    31
    32
     
    struct x
    {
       int i;
       char *s;
    };
     
    {
       struct x a;
     
       a.i = 123;
       a.s = strdup ("hello"); /* strdup() est POSIX.1, donc très portable */
     
     
       struct x b;
     
       /* copie basique */
       b = a;
     
    /* 
       b.i est correct (valeur : 123) 
       b.s a l'adresse de la copie dynamique de "hello". 
     
       Si ca ne convient, pas, il faut faire une copie dynamique avec strdup() : 
    */
       b.s = strdup (b.a);
     
    /*
       Evidemment, il faut ensuite penser à libérer tout ce qui a été alloué. 
       strdup() utilise malloc().
    */
    }
    La manière de copier les données peut changer. Par exemple malloc() + '=', ou malloc() + memcpy() etc. Tout dépend de la nature exacte des données (objet simple, structure, tableau, tableau de structures etc.)...

    L'important est de fournir la bonne taille à malloc()...
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Existe t il une version de strdup ou autre fonction qui copie des entiers et pas seulement les chaine de caractéres??

  6. #6
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par pauligno Voir le message
    Existe t il une version de strdup ou autre fonction qui copie des entiers et pas seulement les chaine de caractéres??
    Oui, c'est l'operateur d'assignation =

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Non mais je veux qu'il m'alloue un autre espace mémoire.

    Quand je copie ma structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      tas bob= tas_creer(self->comparaison);
      bob = self;
      bob->dernier_element=self->dernier-element
    puis après j'effectue des changements sur bob->dernier_element
    les changement sont aussi effectuer sur self->dernier_element

    comment faire ?

  8. #8
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par pauligno Voir le message
    Non mais je veux qu'il m'alloue un autre espace mémoire.
    Alors ce n'est pas une copie que tu veux faire.

    Quand je copie ma structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      tas bob= tas_creer(self->comparaison);
      bob = self;
      bob->dernier_element=self->dernier-element
    tas_creer te renvoie un resultat (une adresse j'imagine, meme si le typedef tas n'est pas explicite) que tu mets dans bob. Puis tu ecrases ce resultat avec self. Il y a un probleme de conception ici. Es-tu bien sur d'avoir reflechi a ce que tu veux faire?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    oui j'en suis sur

    tas_creer() de bob renvoi une srtucture basique
    je veux lui affecter toute les valeurs qu'il y a dans self

    car pour ma fonction afficher le tas supprime la valeur maximale pour pouvoir réorganiser le tas.
    Donc c'est pour ca que j'ai crée une copie. Je m'exprime mal mais es ce que je demande existe? une fonction strdup () qui prend des entiers?

  10. #10
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par pauligno Voir le message
    tas_creer() de bob renvoi une srtucture basique
    je veux lui affecter toute les valeurs qu'il y a dans self
    Alors c'est une simple copie de structure bob = self. La difficulte vient des pointeurs: si tu veux une vraie copie, alors il faut egalement copier les donnees pointees. Revoir les messages d'Emmanuel, il t'as tout explique.

    Je m'exprime mal mais es ce que je demande existe? une fonction strdup () qui prend des entiers?
    strdup(), c'est le = des chaines de caracteres, si tu veux voir les choses comme ca. Emmanuel a utilise strdup() en faisant l'hypothese que les donnees pointees etaient des chaines de caractere. Si ce n'est pas le cas, alors oublie strdup().

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

Discussions similaires

  1. Comment créer une structure de donnée dynamiquement ?
    Par Beaunico dans le forum Langage
    Réponses: 9
    Dernier message: 24/01/2006, 09h34
  2. [C++] Comment copier une partie d'une chaine?
    Par irnbru dans le forum C++
    Réponses: 11
    Dernier message: 25/10/2005, 15h36
  3. Comment Copier une table dans un fichier?
    Par thx2003 dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/12/2003, 12h09
  4. Comment copier une clé de la base des registres ?
    Par annecyrond dans le forum Langage
    Réponses: 2
    Dernier message: 16/09/2003, 07h53
  5. Comment copier une image dans le presse papier.
    Par cprogil dans le forum Langage
    Réponses: 7
    Dernier message: 09/09/2003, 15h54

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