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 :

copier une structure dans un tableau de structures


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut copier une structure dans un tableau de structures
    salut,

    j'ai une strcuture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct configuration c;
    et un tableau dynamique de structure configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	struct configuration *voisins;
    	voisins =(struct configuration*) malloc (sizeof(configuration)*2*nb_param_DS);
    j'aurais à manipuler c, puis la stocker dans voisins, puis la manipuler de nouveau et la stocker dans une autre case dans voisins.

    Est-ce que le simple fait de faire:
    copie la structure ou juste le pointeur? si c juste le pointeur alors je crois que toutes les copies dans voisins n'auront plus un sens, voisins contiendrait les mêmes valeurs.

    Alors comment faire la copie?
    Merci

  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 maracana
    j'ai une structure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct configuration c;
    et un tableau dynamique de structure configuration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	struct configuration *voisins;
    	voisins =(struct configuration*) malloc (sizeof(configuration)*2*nb_param_DS);
    C'est horriblement confus. Je conseille d'utiliser une notation simple qui est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    T *p = malloc (sizeof *p * n);
    Ce qui donne ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       struct configuration *voisins = malloc (sizeof *voisins * 2 * nb_param_DS);
    j'aurais à manipuler c, puis la stocker dans voisins, puis la manipuler de nouveau et la stocker dans une autre case dans voisins.

    Est-ce que le simple fait de faire:
    Etant donné que c n'est pas un pointeur, *c n'a aucun sens. Tu veux sans doute dire :
    ?

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Salut !


    Tu doit plutôt utiliser la fonction memcpy soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy (voisins[i], c, sizeof (c));
    Mais pourquoi ne pas tout de suite travailler avec le tableau de structures ?

  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 Franck.H
    Tu doit plutôt utiliser la fonction memcpy soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy (voisins[i], c, sizeof (c));
    Pourquoi ? Qu'est-ce qui ne va pas avec = ?

  5. #5
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Pourquoi ? Qu'est-ce qui ne va pas avec = ?
    La force de l'habitude !

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Etant donné que c n'est pas un pointeur, *c n'a aucun sens. Tu veux sans doute dire :
    ?
    parce que voisins est un pointeur vers des structures et c est une structure, çà donne une erreur de compilation.

    alors memcpy serait la meilleure solution?

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Franck.H
    Salut !


    Tu doit plutôt utiliser la fonction memcpy soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memcpy (voisins[i], c, sizeof (c));
    Mais pourquoi ne pas tout de suite travailler avec le tableau de structures ?
    j'ai pas compris, c'est pas un tableau de structures ce que j'ai fait?
    J'ai besoin du malloc, la taille du tableau est dynamique, elle change selon l'itération selon d'autres équations que celle que j'ai donné

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 923
    Points
    17 923
    Billets dans le blog
    2
    Par défaut
    Normalement faire :

    Copie les champs.

    Cependant, si tu as dans c des pointeurs et des allocations dynamiques, je ne suis pas certain que ça ne copie pas juste les pointeurs....

  9. #9
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Soa,
    Citation Envoyé par souviron34
    Normalement faire :

    Copie les champs.

    Cependant, si tu as dans c des pointeurs et des allocations dynamiques, je ne suis pas certain que ça ne copie pas juste les pointeurs....
    C'est bien ça, seuls les pointeurs seront copiés.

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par droggo
    Soa,

    C'est bien ça, seuls les pointeurs seront copiés.
    oui mais si pour un premier temps je fais:
    voisins[0]=c;
    puis je change c et je refais:
    voisins[1]=c;

    est-ce que le contenu de voisin[0] reste celui de l'ancien c ou bien çà changera?

    je crois que la méthode à suivre est la copy avec memcpy

  11. #11
    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 maracana
    oui mais si pour un premier temps je fais:
    voisins[0]=c;
    puis je change c et je refais:
    voisins[1]=c;

    est-ce que le contenu de voisin[0] reste celui de l'ancien c ou bien çà changera?
    voisins[0] reste inchangé. La copie a recopié tous les champs.
    je crois que la méthode à suivre est la copy avec memcpy
    C'est pareil, à part que c'est plus long à écrire...

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    voisins[0] reste inchangé. La copie a recopié tous les champs.

    C'est pareil, à part que c'est plus long à écrire...
    merci çà me rassure, çà sauve 1000 lignes de code.
    quand on fait toute une plateforme, des fois on ne sait plus où on est

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 16/11/2014, 20h09
  2. tableau de structure dans une structure
    Par igloo2 dans le forum Débuter
    Réponses: 3
    Dernier message: 11/01/2013, 18h25
  3. Tableau de structures dans une structure
    Par adrienmgs dans le forum Débuter
    Réponses: 8
    Dernier message: 03/04/2011, 00h48
  4. Copier une liste dans un tableau Numpy
    Par manaliac dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 17/09/2010, 10h56
  5. Réponses: 1
    Dernier message: 29/06/2007, 15h13

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