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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 26
    Points : 12
    Points
    12

    Par défaut Assignation pointeur et structure : besoin de lumière

    Bonjour à tous,

    A partir d'un tuto j'essaye de construire un petit code mettant en application les types structures.
    Il consiste à récupérer deux coordonnées, a assigner ces valeurs à un pointeur et ensuite à initialiser le pointeur.
    Puis j'affiche les coordonnées d'avant et celles devant être désormais initialisées.
    La compilation sur CodeBlocks n'affiche aucune erreur, seulement le programme dans la console plante une fois les coordonnées passées dans le scanf.
    Un oeil averti saurait t'il percevoir l'erreur?

    Merci

    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
    //Dans mon header:
    typedef struct Coordonnees Coordonnees; //Typedef est une fonction qui définit une structure et son nom sous forme du nom seulement.
    struct Coordonnees
    {
        int x;
        int y;
    };
     
    int main(int argc, char *argv[])
    {
    Coordonnees point;
    Coordonnees *pointeurTest;
     
    printf("\n\n Coordonnees x: ");
    scanf("%d",&point.x);
    printf("\n\n Coordonnees y: ");
    scanf("%d",&point.y);
     
    *pointeurTest = point;
    printf("\n\n Passage du pointeur dans la fonction d'initialisation.");
    initialiserStructure(pointeurTest);
    printf("ANCIENNES VALEURS: x= %d, y=%d\nNOUVELLES VALEURS:x=%d, y=%d",point.x,point.y,pointeurTest->x,pointeurTest->y);
    }
     
    void initialiserStructure(Coordonnees *ptr)
    {
    (*ptr).x=0;
    (*ptr).y=0;
    }

  2. #2
    Membre éclairé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 365
    Points : 791
    Points
    791

    Par défaut

    Hello,

    Si tu n'as pas d'erreur à la compilation, j'ai une warning, qui a tout son sens: pointeurTest is used unitinialized (pour la ligne 19)

    Et en effet, c'est
    L'affichage des anciennes valeurs doit se faire avant d'appeler initialiserStructure()

  3. #3
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 26
    Points : 12
    Points
    12

    Par défaut

    Citation Envoyé par edgarjacobs Voir le message
    Hello,

    Si tu n'as pas d'erreur à la compilation, j'ai une warning, qui a tout son sens: pointeurTest is used unitinialized (pour la ligne 19)

    Et en effet, c'est
    L'affichage des anciennes valeurs doit se faire avant d'appeler initialiserStructure()

    Mince, le message m'avait échappé.Alors j'ai initialisé le pointeur au démarage (ci dessous) de sorte à éviter le message, qui a disparu, mais l'erreur demeure
    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
    int main(int argc, char *argv[]){
    Coordonnees point;
    Coordonnees *pointeurTest=0;
     
    printf("\n\n Coordonnees x: ");
    scanf("%d",&point.x);
    printf("\n\n Coordonnees y: ");
    scanf("%d",&point.y);
     
    *pointeurTest = point;
    printf("\n\n Passage du pointeur dans la fonction d'initialisation.");
    initialiserStructure(pointeurTest);
    printf("ANCIENNES VALEURS: x= %d, y=%d\nNOUVELLES VALEURS:x=%d, y=%d",point.x,point.y,pointeurTest->x,pointeurTest->y);
    }
     
    void initialiserStructure(Coordonnees *ptr)
    {
    (*ptr).x=0;
    (*ptr).y=0;
    }
    J'avais choisi d'utiliser un pointeur de sorte à pouvoir dissocier l'initialisation de mes coordonnées (en gardant les valeurs de ma variable) comme ça je pouvais affecter la valeur à mon pointeur pour l'initialiser lui, espérant ainsi afficher en même temps nouvelle et ancienne valeur. Il doit bien être possible de dupliquer une info, de lui appliquer un traitement et d'afficher les duplicats de valeur désormais différente? Je n'ai donc pas conçu la bonne méthode?

    Merci de ton aide.

  4. #4
    Membre expert
    Inscrit en
    mars 2005
    Messages
    1 324
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 324
    Points : 3 886
    Points
    3 886

    Par défaut

    Il y a plusieurs points d'incompréhension ici, qui concernent tous les pointeurs et pas les structures. Peut-être devrais-tu donc commencer par faire fonctionner ton programme avec une simple variable de type entier afin de bien en saisir les tenants et les aboutissants.

    L'intérêt d'utiliser une référence (ici, un pointeur) sur un objet (ici, ta variable de type « coordonnées 2D ») permet justement de ne pas dupliquer l'ensemble des données formant cet objet. Si tu veux réaliser une copie « complète » et conserver l'objet originel, tu ne dois justement pas le référencer mais bien le dupliquer. Ce n'est donc pas avec un pointeur que tu obtiendras le résultat escompté (en tout cas, pas en l'utilisant de cette manière).

    En ce qui concerne les pointeurs, puisque tu devras y passer même en dehors du cadre de cet exercice, il est par exemple crucial de comprendre la différence entre p = &a; et *p = a; . Que font l'une et l'autre, à ton avis ?

  5. #5
    Membre éclairé Avatar de edgarjacobs
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2011
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : mai 2011
    Messages : 365
    Points : 791
    Points
    791

    Par défaut

    As-compris ce que tu as écrit ?

    Tu assignes 0 (soit NULL) à pointeurTest, et puis tu demandes de mettre quelque chose à l'adresse NULL

  6. #6
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 26
    Points : 12
    Points
    12

    Par défaut

    Citation Envoyé par Matt_Houston Voir le message
    Il y a plusieurs points d'incompréhension ici, qui concernent tous les pointeurs et pas les structures. Peut-être devrais-tu donc commencer par faire fonctionner ton programme avec une simple variable de type entier afin de bien en saisir les tenants et les aboutissants.

    L'intérêt d'utiliser une référence (ici, un pointeur) sur un objet (ici, ta variable de type « coordonnées 2D ») permet justement de ne pas dupliquer l'ensemble des données formant cet objet. Si tu veux réaliser une copie « complète » et conserver l'objet originel, tu ne dois justement pas le référencer mais bien le dupliquer. Ce n'est donc pas avec un pointeur que tu obtiendras le résultat escompté (en tout cas, pas en l'utilisant de cette manière).

    En ce qui concerne les pointeurs, puisque tu devras y passer même en dehors du cadre de cet exercice, il est par exemple crucial de comprendre la différence entre p = &a; et *p = a; . Que font l'une et l'autre, à ton avis ?
    Bon. Merci de ces indications. Je vais réfléchir.
    Si j'ai bien compris
    p=&a
    est une attribution d'adresse (référence) et
    *p=a
    est une attribution de valeur.
    Okay j'ai compris...
    Eh oui, le pointeur va modifier la variable dès l'assignation... Ok. Je croyais le la variable elle, gardait sa valeur "volatile" et que le pointeur changerait la valeur d'adresse.

    Okay. Désolé de mon amateurisme. Donc si j'ai bien compris la solution est d'attribuer d'abord la valeur de ma variable à une tierce variable.

    Merci beaucoup

  7. #7
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 26
    Points : 12
    Points
    12

    Par défaut

    Ca y est j'ai réussi . Merci de votre aide (oui effectivement l'affectation NULL pendant la déclaration était une hérésie) .



    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
    int main(){
    Coordonnees point, passage;
    Coordonnees *pointeurTest;
     
    printf("\n\n Coordonnees x: ");
    scanf("%d",&point.x);
    printf("\n\n Coordonnees y: ");
    scanf("%d",&point.y);
     
    passage = point;
    pointeurTest = &point;
    printf("\n\n Passage du pointeur dans la fonction d'initialisation.");
    initialiserStructure(pointeurTest);
    printf("\n\nANCIENNES VALEURS: x= %d, y=%d\nNOUVELLES VALEURS: x=%d, y=%d",passage.x,passage.y,pointeurTest->x,pointeurTest->y);
    }
     
    void initialiserStructure(Coordonnees *ptr)
    {
    (*ptr).x=0;
    (*ptr).y=0;
    }

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    6 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 6 493
    Points : 18 258
    Points
    18 258
    Billets dans le blog
    1

    Par défaut

    Citation Envoyé par Theophile69 Voir le message
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Coordonnees *pointeurTest=0;
    *pointeurTest = point;
    Je n'ai donc pas conçu la bonne méthode?
    Bonjour

    En plus des remarques très adéquates de Matt_Houston, je vais te donner un secret pour je ne dis pas comprendre les poiteurs mais éviter de te vautrer avec eux.

    Chaque fois que tu utiliseras un pointeur (ex: Coordonnees *pointeurTest, tu ne devras jamais jamais jamais manipuler le pointé (ici *pointeurTest) tant que tu n'auras pas écrit quelque part au dessus pointeur=adresse_valide_autre_que_0 (donc ici pointeurTest=adresse_valide).

    Et c'est quand tu sauras quoi mettre après le "=" que tu auras compris les pointeurs (voir donc à ce sujet la phrase de Matt_Houston qui parle de compréhension "cruciale").

    Seule et unique exception à cette règle: quand le pointeur arrive en tant que paramètre de fonction (ex: void init(int *pt, int v) {*pt=v}. Là, quand tu remplis "*pt", tu es bien évidemment obligé de présumer que "pt" contient une adresse valide (initialisée par celui qui appelle la fonction).

    Je ne dis pas que chaque fois que tu respecteras cette règle tu t'en sortiras (ce serait un sophisme) mais en tout cas chaque fois que tu dérogeras à cette règle, tu te planteras (comme ici par exemple).
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  9. #9
    Membre à l'essai
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    octobre 2017
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant fonctionnel
    Secteur : Santé

    Informations forums :
    Inscription : octobre 2017
    Messages : 26
    Points : 12
    Points
    12

    Par défaut

    Ahaha.
    Okay. Je vais me référer à ces bons conseils durant les semaines à venir.
    Merci encore à vous tous.

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

Discussions similaires

  1. Pointeur structure : besoin d'éclaircissements
    Par julien.63 dans le forum C
    Réponses: 4
    Dernier message: 28/04/2007, 00h26
  2. [C#]Pointeur vers structure
    Par torNAdE dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/05/2006, 19h43
  3. Réponses: 7
    Dernier message: 08/04/2006, 12h18
  4. Pointeurs et structures...
    Par vinzzzz dans le forum C
    Réponses: 13
    Dernier message: 18/01/2006, 11h37
  5. probleme avec pointeurs de structures
    Par remi77 dans le forum C
    Réponses: 2
    Dernier message: 20/10/2003, 13h19

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