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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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) ?

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    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
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    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()...

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 9
    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 Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    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 =

+ 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