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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut Copie d'une structure
    Bonjour,

    Voici ma structure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    typedef struct elt {
    	typeDonnee val;        // Champ donnée
    	struct elt *suivant;   // Pointeur sur l'élément suivant
    } typeElt;
    Si je crée deux pointeurs ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typeElt *courant;
    typeElt *nouveau;
    que j'insère la valeur 7 dans la première structure ainsi :

    Si j'effectue ensuite l'opération suivante :

    est-ce que dans *nouveau il y aura la valeur 7 ou pas du tout ?

    Merci pour votre aide.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 492
    Billets dans le blog
    1
    Par défaut
    Oui car courant et nouveau pointent désormais sur le même élément (tu le constates en affichant la valeur des pointeurs avec le formateur %p). Mais je pense que ce n'est pas ce que tu voulais faire.

    Essaye *nouveau = *courant (j'ai un doute d'un seul coup sur la syntaxe...).

    Ah au fait : tu as créé les structures ou juste les pointeurs ? Vu ton code, je pense que tu n'as pas crée les structures dont tes pointeurs pointent sur rien (ou n'importe quoi, au choix). Par exemple, int *p; ne crée pas de int. Ici, c'est pareil.

  3. #3
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut
    Non j'ai ma réponses c'est tout bon, merci beaucoup. En fait ça crée une copie identique de la structure (mais cette copie comprend aussi la valeur contenue dans la variable "val").

  4. #4
    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
    Si tu vérifies le contenu de nouveau->val tu auras bien 7. Mais malgré l'illusion du résultat tu n'obtiendras finalement pas le résultat voulu.

    Le fait d'écrire nouveau = courant indique que l'adresse de nouveau correspond maintenant à l'adresse de courant. Ce n'est donc pas une copie. Tu pointes toujours sur le même élément.

  5. #5
    Membre très actif
    Homme Profil pro
    Ingénieur après-vente
    Inscrit en
    Novembre 2014
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur après-vente

    Informations forums :
    Inscription : Novembre 2014
    Messages : 367
    Par défaut
    Oui c'est vrai en fait j'ai deux pointeurs qui pointent au même endroit. Donc l'opération de création "copie" (qui n'en est en réalité pas une) est totalement inutile.

  6. #6
    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
    La copie de pointeur n'est pas toujours inutile. Par exemple lors de la lecture d'une liste chaînée il est intéressant de copier le pointeur du premier élément. On peut alors incrémenter cette copie pour passer d'un élément à l'autre sans pour autant perdre le pointeur du premier.

    Il y a certainement d'autres cas existants...

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 450
    Par défaut
    Citation Envoyé par wallace27 Voir le message
    Oui c'est vrai en fait j'ai deux pointeurs qui pointent au même endroit.
    Non seulement ça ne produit pas une copie mais tu ne fais que déclarer des pointeurs sans dûment les initialiser, ça ne produira pas d'instance du tout. Ça veut dire que si tu essaies d'écrire « courant->val = 7 » en l'état, le résultat sera indéterminé. Le plus probable est que cela aille écrire n'importe où et déclenche une segfault mais si, par le plus grand des hasards, la valeur initiale de ton pointeur renvoie vers l'intérieur de l'espace mémoire de ton processus, alors tu ira corrompre les variables d'à côté sans même t'en rendre compte, provoquant un bug qui ne se manifestera que bien plus tard.

    Donc l'opération de création "copie" (qui n'en est en réalité pas une) est totalement inutile.
    Au contraire, les références multiples à un même objet sont un des concepts fondamentaux en informatique. C'est le fonctionnement par défaut des objets de Java, c'est le principe des liens durs sous UNIX et d'une manière générale, de celui des index. Ça peut donc être très utile mais ce n'est probablement pas ce qu'il te faut dans le cas présent et, surtout, ça traduit une petite erreur de compréhension. Et c'est surtout celles-là qu'il faut identifier et combattre le plus tôt possible puisque la programmation est une activité essentiellement cérébrale.

    Et puisque l'on en parle, est-ce que par hasard tu viendrais du monde Java au départ ? Si c'est le cas, ça peut expliquer beaucoup de choses et ça nous permettrait de nous replacer dans le cadre le plus approprié pour te présenter les choses de manière adéquate.

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. [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
  3. Copie d'une structure.
    Par gerald3d dans le forum C
    Réponses: 12
    Dernier message: 24/03/2008, 12h22
  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