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 :

Problème de pointeurs


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut Problème de pointeurs
    Bonjour,

    J'essaye de résoudre un problème depuis un bon moment, sans y arriver, j'aurais besoin de vos lumières car là je n'ai plus assez de recule.
    Effectivement, me code se sépare en plusieurs fonctions:

    Fonction principale:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Déclaration
    struct toto *pt_toto;
    [...]
    //Appel de fonction
    fonctionCalcul(pt_toto);
    printf("pt_toto[0].nb[0] = %d\n", pt_toto[0].nb[0]);
    Fonction calcul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    int fonctionCalcul(struc toto *ptMaStructToto)
    //Déclaration
    struct toto *pointeur_toto;
    struct toto mToto;
    [...]
    pointeur_toto = malloc( 50* sizeof(mToto) );
    //Sauvegarde de l'addresse
    ptMaStructToto = pointeur_toto;
    printf("pointeur_toto[0].nb[0] = %d\n", pointeur_toto[0].nb[0]);
    printf("ptMaStructToto [0].nb[0] = %d\n", ptMaStructToto [0].nb[0]);
    Les 2 printf de la fonctionCalcul donne la même chose, or dans la fonction principale, je ne retrouve pas la même chose.
    Est-ce que c'est mon intialisation de pointeurs de structure qui est incorrecte, ou est-ce la portée du malloc ?

    Si vous avez des pistes je suis preneur.

    Merci,

    Bat

  2. #2
    Membre du Club Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Plop !

    Tu ne modifie pas le pointeur passé en paramètre mais un copie de celui-ci.
    Ici ta fonction retourne un int, si tu veux que le pointeur passé en paramètre change tu dois retourner le pointeur correspondant :

    Ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptMaStructToto = fonctionCalcul(ptMaStructToto)
    Et le prototype de ta fonction doit être :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ptMaStructToto *fonctionCalcul(ptMaStructToto *ptr)
    Keep calm and debug ...

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Une question similaire traitée récemment : http://www.developpez.net/forums/d15...rs-sauvegarde/ .

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Merci Waether pour ta réponse.

    Je comprends bien ce que tu me dis, cependant, est-ce qu'il ne serait pas possible d'écrire à l'adresse passée en argument, un petit exemple pour illustrer mes propos:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int a;
    int *pta;
    a = 5;
    fonctionCalcul(&a)
    En mémoire j'ai:
    à l'adresse 0x0 la valeur 5
    à l'adresse 0x10 le pointeur pta

    Ici je passe l'adresse de la variable a
    Dans ma fonction calcul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int fonctionCalcul(int *pt)
    {
    int *ptTemp;
    ptTemp = malloc( 50 * sizeof(int));
     
    }
    ici à l'adresse 0x25 j'ai le pointeur pt dont la valeur vaut 0x0 et à l'adresse 0x40 j'ai le pointeur ptTemp qui n'est pas initialié (les adresses sont données au pif pour l'exemple)

    Comment faire pour "dire" écrit 0x40 à l'adresse 0x0 ?



    Effectivement, j'ai simplifié mes fonctions, mes celle-ci sont amenées à allouer/modifier plusieurs tableau dont les adresses sont passées en arguments

  5. #5
    Membre du Club Avatar de Waether
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 44
    Points : 69
    Points
    69
    Par défaut
    Voila un petit exemple sur le fonctionnement des pointeurs :

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    void	changeptr(int **a_changer, int *a_affecter)
    {
      *a_changer = a_affecter;
    }
     
    int	main()
    {
      int	*ptr1 = malloc(sizeof(int));
      int	*ptr2 = malloc(sizeof(int));
     
      ptr1[0] = 42;
      ptr2[0] = 12;
     
      printf("ptr1[0] = %d\n", ptr1[0]);
      printf("ptr2[0] = %d\n", ptr2[0]);
     
      changeptr(&ptr1, ptr2);
     
      printf("ptr1[0] = %d\n", ptr1[0]);
      printf("ptr2[0] = %d\n", ptr2[0]);
     
      return 0;
    }
    A l'execution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ptr1[0] = 42
    ptr2[0] = 12
    ptr1[0] = 12
    ptr2[0] = 12
    Ici j'ai deux pointeurs, je veux changer l'adresse vers laquelle pointe ptr1 sasn pour autant le renvoyer.
    J'utilises donc l'adresse du mon pointeur ptr1 pour modifier la valeur de mon pointeur (a ne pas confondre avec la valeur sur laquelle pointe ptr1)
    Le "&" permet d'obtenir l'adresse d'une variable, l' "*" permet de modifier ou d'obtenir la valeur à cette adresse.


    Un autre exemple qui correspond peut-être plus à ce que tu veux :

    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
    #include <stdlib.h>
    #include <stdio.h>
     
    void    changeval(int *a_changer)
    {
      *a_changer = 123;
    }
     
    int     main()
    {
      int   *ptr1 = malloc(sizeof(int));
     
      ptr1[0] = 42;
     
      printf("ptr1[0] = %d\n", ptr1[0]);
     
      changeval(ptr1);
     
      printf("ptr1[0] = %d\n", ptr1[0]);
     
      return 0;
    }
    Keep calm and debug ...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    Merci Matt Houston, j'ai testé le double pointeur, et ça marche !!

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

Discussions similaires

  1. Problème de pointeurs..embrouillé
    Par Frenchy dans le forum C++
    Réponses: 11
    Dernier message: 10/03/2005, 16h33
  2. Problème de pointeur avec un TQuery
    Par Oluha dans le forum Bases de données
    Réponses: 3
    Dernier message: 25/01/2005, 13h57
  3. Problème de pointeur
    Par toma_lille dans le forum C++
    Réponses: 1
    Dernier message: 07/12/2004, 21h26
  4. [MFC] Problème de pointeur !!
    Par acastor dans le forum MFC
    Réponses: 7
    Dernier message: 19/03/2004, 15h50
  5. TBitmap et problèmes de pointeurs...
    Par benj63 dans le forum C++Builder
    Réponses: 8
    Dernier message: 28/07/2003, 13h39

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