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 :

Copie d'une structure.


Sujet :

C

  1. #1
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut Copie d'une structure.
    Bonjour à toutes et à tous.

    Je désire copier une structure allouée dynamiquement. Jusqu'à présent j'allouais un nouveau bloc mémoire puis copiais une à une les variables de la source vers la copie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mastructure *source;
    mastructure *copie;
     
    copie->a=source->a;
    copie->b=source->b;
    ...
    J'ai besoin de rapidité pour mon application. Ce matin m'est venu une idée farfelue mais qui me semble être correcte. Je vous la pose donc en attendant vos commentaires éclairés.

    En admettant que toutes les données de mastructure ne soient que des données simples (pas de liste chaînée par exemple) puis-je faire une copie du bloc mémoire entier de source directement dans copie comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    copie=(mastructure*)malloc(sizeof(mastructure));
     
    copie=memcpy (copie, source, sizeof(mastructure));
    En opérant comme ca vais-je retrouver tout dans l'ordre?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Oui, mais pour copier une structure dans une autre, il suffit d'écrire struct1 = struct2

  3. #3
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    En admettant que toutes les données de mastructure ne soient que des données simples (pas de liste chaînée par exemple) puis-je faire une copie du bloc mémoire entier de source directement dans copie comme ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    copie=(mastructure*)malloc(sizeof(mastructure));
    copie=memcpy (copie, source, sizeof(mastructure));
    En opérant comme ca vais-je retrouver tout dans l'ordre?
    Exact !

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par diogene Voir le message
    Oui, mais pour copier une structure dans une autre, il suffit d'écrire struct1 = struct2
    exemple :
    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
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
        struct maStruct { int a; int b; };
        struct maStruct * struct1 = NULL;
        struct maStruct * struct2 = NULL;
    
        struct1 = malloc (sizeof *struct1);
        struct2 = malloc (sizeof *struct2);
    
        struct1->a = 2;
        struct1->b = 4;
    
        *struct2 = *struct1;
    
        printf ("%d %d\n", struct2->a, struct2->b);
        return 0;
    }

  5. #5
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par diogene Voir le message
    Oui, mais pour copier une structure dans une autre, il suffit d'écrire struct1 = struct2
    Non. tu ne fais que copier le pointeur de la struct2. Si tu désalloues struct2 struct1 pointe sur n'importe quoi aprés.

    Moi j'ai vraiment besoin d'une vraie copie.

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Citation Envoyé par diogene Voir le message
    Oui, mais pour copier une structure dans une autre, il suffit d'écrire struct1 = struct2
    Non !

    En considérant que source pointe vers une structure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mastructure *source;
    mastructure *copie
    copie = source;
    En faisant copie=source, la structure pointée vers source ne sera pas copiée. Le pointeur copie pointera simplement vers la même structure que source.

  7. #7
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    exemple :
    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
    #include <stdio.h>
    #include <stdlib.h>
    
    int main (void)
    {
        struct maStruct { int a; int b; };
        struct maStruct * struct1 = NULL;
        struct maStruct * struct2 = NULL;
    
        struct1 = malloc (sizeof *struct1);
        struct2 = malloc (sizeof *struct2);
    
        struct1->a = 2;
        struct1->b = 4;
    
        *struct2 = *struct1;
    
        printf ("%d %d\n", struct2->a, struct2->b);
        return 0;
    }
    Je ne pensais pas que *struct2 = *struct1; suffirait à copier tous les éléments de la structure !
    Mon code va se simplifier. Merci à vous tous.

  8. #8
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    C'est ce qu'à expliqué diogene :
    Citation Envoyé par diogene Voir le message
    Oui, mais pour copier une structure dans une autre, il suffit d'écrire struct1 = struct2

  9. #9
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je n'ai pas compris sa réponse comme ca. Au temps pour moi si c'était le fond de sa pensée.

  10. #10
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je n'ai pas compris sa réponse comme ca. Au temps pour moi si c'était le fond de sa pensée.
    Pas de soucis, c'est bien pour ce la que j'ai donné un exemple.
    Cordialement. (pense à la balise résolu)

  11. #11
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    C'est ce qu'à expliqué diogene
    En précisant que quand il écrit struct1=struct2, struct1 et struct2 sont des structures et non pas des ponteurs de structures, sa pensée aurait été plus claire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    maStruct struct1;
    maStruct struct2 = struct1;
     
    maStruct* pstruct1 = &struct1;
    maStruct* pstruct2 = malloc (sizeof maStruct);
    *pstruct2 = *pstruct1;

  12. #12
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    J'avais pourtant bien écris "copier les structures" pas les pointeurs de structures.
    nicolas.sitbon : tu as raison, on ne donne jamais trop de détails.

  13. #13
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Citation Envoyé par diogene Voir le message
    J'avais pourtant bien écris "copier les structures" pas les pointeurs de structures.
    Exact, mais le problème initial concernait des pointeurs de structure.
    Citation Envoyé par gerald3d Voir le message
    Je désire copier une structure allouée dynamiquement.

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

Discussions similaires

  1. [XSLT 1.0] copie d'une structure xml avec suppression de certains noeuds
    Par oliv47 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 04/06/2015, 19h05
  2. Copie d'une structure
    Par wallace27 dans le forum C
    Réponses: 6
    Dernier message: 12/02/2015, 17h49
  3. [MySQL] Copie de la structure d'une table mysql
    Par Psycha dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/05/2009, 14h33
  4. Réponses: 8
    Dernier message: 21/05/2007, 21h40
  5. Copie d'un buffer dans une structure
    Par KnightsOfTheRound dans le forum C++
    Réponses: 6
    Dernier message: 29/12/2005, 15h00

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