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 :

fonction, pointeurs , variables inchangées


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut fonction, pointeurs , variables inchangées
    Bonjour.

    J'ai les arguments de ma fonction qui ne retourne pas le traitement effectué dans ma fonction, ça sera plus clair avec le code ...
    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
     
    void func(int *,int *);//prototype
    int main()
    {
    int a=0,b=0;
    func(&a,&b);// passage de mes arguments
    printf("a:%d, b:%d",a,b);//a=b=0;
    retunr 0;
    }
    void func(int* var1, int* var2)
    {
    int un,deux;
    //Traitement...
    var1=&un;
    var2=&deux;
    printf("var1:%d, var2:%d",*var1,*var2);//exemple *var1=1 et *var=2
    }
    Donc mon ma fonction ne change pas mes variables a et b elles restent null, bien que le changement s'effectue dans ma fonction.
    Je vous remercie d'avoir pris le temps de lire .

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    Il y a deux problèmes dans ton code :
    • Si je te donne le code suivant :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      void foo(int a)
      {
          a = 2;
      }
      int main(void)
      {
          int a = 0;
          foo(a);
          printf("a = %d \n", a);   
       
          return 0;
      }
      T'attends-tu à avoir la valeur de a changée ? Non ? Et bien c'est la même chose pour les pointeurs
      Tu peux modifier ce vers quoi ils pointent, ce changement sera alors bien pris en compte, mais tu ne peux pas le modifier lui-même car le paramètre passé reste avant tout une copie.
    • Les variables un et deux sont des variables locales à la fonction func, et donc dès que tu sors de ta fonction, la mémoire occupée par ces deux variables est susceptible d'être utilisée n'importe comment, et tu te retrouves donc devant un comportement indéterminé.

    Ici, tu peux directement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *var1 = un;
    *var2 = deux;
    Pense aussi à indenter proprement ton code.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    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 493
    Billets dans le blog
    1
    Par défaut
    Comme dit par Winjerome, le C utilise des fonction avec copie des paramètres. Si tu veux modifier un int i dans une fonction foo(), il faut passer un pointeur sur int i à cette fonction. Ainsi, dans la fonction (qui travaillera sur une copie de pointeur sur int) tu pourras accéder à i en dé-référençant le pointeur.

    En généralisant, si tu veux modifier une variable de type TOTO dans une fonction, il faut que cette fonction prenne en paramètre un objet de type POINTEUR SUR TOTO. C'est valable quoi que soit TOTO : int, float, char, pointeur sur int, structure, pointeur sur pointeur de structure de tableau de int.

    Si tu veux modifier un pointeur sur int dans une fonction, alors TOTO est POINTEUR SUR INT et tu dois passer à la fonction un pointeur sur pointeur sur int.

    Accessoirement, ici, tu as surtout besoin de faire ce que te propose Winjerome : modifier la valeur pointée et non le pointeur.

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Merci pour vos réponses, je suis vraiment désolé mais je ne vois toujours pas mon erreur, pourtant j'ai relu plusieurs fois et j'ai fait des recherches... Pourrais-tu carrement modifier la partie de mon code stp. Le problème c'est que je ne vois pas ma faute meme avec les explications...

  5. #5
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonjour,

    Citation Envoyé par dashed Voir le message
    Merci pour vos réponses, je suis vraiment désolé mais je ne vois toujours pas mon erreur, pourtant j'ai relu plusieurs fois et j'ai fait des recherches... Pourrais-tu carrement modifier la partie de mon code stp. Le problème c'est que je ne vois pas ma faute meme avec les explications...
    Indice : il faudrait quelque chose capable de pointer sur un pointeur.

    Bonne journée.
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    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 493
    Billets dans le blog
    1
    Par défaut
    Passer de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var1=&un;
    var2=&deux;
    à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    *var1=un;
    *var2=deux;
    te donne ce que tu veux ?

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 39
    Par défaut
    Oui merci beaucoup en bidouillant j'ai fini par trouver

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

Discussions similaires

  1. Pointeur de fonction à paramètres variables
    Par Meseira dans le forum Langage
    Réponses: 5
    Dernier message: 04/03/2012, 01h53
  2. appels de fonctions et variables intermediaires
    Par TabrisLeFol dans le forum Langage
    Réponses: 7
    Dernier message: 07/03/2006, 13h37
  3. Paramètres de fonction : pointeurs ou valeurs ?
    Par Xandar dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/11/2005, 16h50
  4. Réponses: 5
    Dernier message: 19/09/2005, 20h58
  5. Réponses: 9
    Dernier message: 24/05/2005, 16h34

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