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 :

Pointeurs parametres fonction entrée/sortie


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 59
    Points
    59
    Par défaut Pointeurs parametres fonction entrée/sortie
    SAlut à tous,

    J'ai un souci de parametre avec 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
    
    void fonction( char *Code, char *pwd)
    {
      char Test[TAILLE] = "TIC";
      Code = Test;
      Test = "TOC";
      pwd = Test;
    }
    
    int main()
    {
      char *Code="Initcode";
      char *Pwd="Initpwd";
    
      fonction(Code, Pwd);
    
      printf("%s\n%s",Code,Pwd);
    }
    Mon programme affiche "TOCTOC" au lieu "TICTOC". En clair, je n'arrive pas a affecter correctement la valeur de "Test" a mes pointeurs dans la fonction.

    Comment faire ?

  2. #2
    Membre du Club
    Inscrit en
    Juin 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 56
    Points : 48
    Points
    48
    Par défaut
    Dans ta fonction essaie de mettre plutot un memcpy pour changer le contenu pointé par tes pointeurs au lieu de reaffecter la valeur de tes pointeurs.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 59
    Points
    59
    Par défaut
    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
     
    void fonction( char *Code, char *pwd)
    {
      char Test[TAILLE] = "TIC";
     
      memcpy(Code,Test,strlen(Test)+1);
      Code = Test;
     
      memcpy(pwd,Test,strlen(Test)+1);
      pwd = Test;
    }
     
    int main()
    {
      char *Code="Initcode";
      char *Pwd="Initpwd";
     
      fonction(Code, Pwd);
     
      printf("%s\n%s",Code,Pwd);
    }
    Soit je l'utilise mal, soit ça peut pas marcher, mais jy arrive toujours pas.

  4. #4
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par SgtBor Voir le message
    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
     
    void fonction( char *Code, char *pwd)
    {
      char Test[TAILLE] = "TIC";
     
      memcpy(Code,Test,strlen(Test)+1);
     /* Code = Test;*/
     
      memcpy(pwd,Test,strlen(Test)+1);
    /*  pwd = Test; */
    }
     
    int main()
    {
      char *Code="Initcode";
      char *Pwd="Initpwd";
     
      fonction(Code, Pwd);
     
      printf("%s\n%s",Code,Pwd);
    }
    Soit je l'utilise mal, soit ça peut pas marcher, mais jy arrive toujours pas.
    Retires les deux lignes que j'ai commenté.

  5. #5
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Points : 70
    Points
    70
    Par défaut
    Re-Bonjour !

    Il y a un Bus Error indetectable par gdb sur mon ordi, m'enfin bon...

    Voila un code qui fonctionne

    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
     
    void fonction( char **Code, char **pwd)
    {
      char Test[] = "TIC";
     
      *Code = strdup(Test);
      Test[1] = '0';
      *pwd = strdup(Test);
    }
     
    int main()
    {
      char *Code="Initcode";
      char *Pwd="Initpwd";
     
      fonction(&Code, &Pwd);
     
      printf("%s\n%s",Code,Pwd);
      return (0);
    }
    Ici, on envoit l'adresse des pointeurs qu'on va recevoir sous la forme de Code et de Pwd.
    Par exemple :
    Les pointeurs qu'on a envoye (ce qui equivaut a *Code et *pwd dans fonction()) :
    (char*) Code = 0x804b00
    (char*) pwd = 0x804b10
    Les pointeurs sur pointeur :
    (char**)Code = 0xb00100 pointant sur 0x804b00
    (char**)pwd = 0xb00110 pointant sur 0x804b10

    La fonction strdup(char *) va allouer de la memoire, copier le contenu le Test et renvoyer un pointeur. Donc notre *Code va etre sur un nouvel emplacement memoire, mais pas Code (le pointeur sur pointeur)
    Apres *Code = strdup(Test) :
    (char**)Code = 0xb00100 ne pointe plus sur 0x804b00 mais sur une nouvelle adresse, disons 0x804b500.
    (char**)pwd = 0xb00110 pointant sur 0x804b10

    Ainsi, on a Code = 0xb00100 et *Code = 0x804b00
    En ressortant de la fonction, on aura modifier les pointeurs de l'adresse envoye en parametre (&Code et &Pwd). Donc Code et Pwd sera modifie.
    Ce n'est pas evident a expliquer mais le principe, c'est ca.

    Par exemple, si tu voulais changer une variable simple style :

    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
     
    void fonction(int *a)
    {
     *a = 5;
    }
     
    int main()
    {
     int a;
     
     a = 3;
      fonction(&a);
    printf("a = %d\n", a);
      return (0);
    }
    Ici, a passerait a 5, car on a envoye l'adresse, on recoit donc un pointeur dans fonction(int *), puis on modifie la valeur de ce pointeur (*a = 5).
    C'est exactement la meme chose, la seule difference est que ca se passe non pas sur un int mais sur un char *, et que donc ce qui est recuperer dans fonction() n'est pas un int* mais un char **.

    C'est pas facile d'etre clair :s J'espere t'avoir quand meme plus aider qu'embrouiller.

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Avril 2010
    Messages
    96
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2010
    Messages : 96
    Points : 59
    Points
    59
    Par défaut
    WOW ! J'ai rarement vu une réponse aussi géniale.

    Ton explication est parfaite, un petit peu de doc a coté pour rafraichir la mémoire ( http://chgi.developpez.com/pointeur/ ) et c'est impeccable.

    ça fonctionne sur mon programme et j'ai tout compris, merci beaucoup à toi Holder

  7. #7
    Membre régulier
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    Points : 70
    Points
    70
    Par défaut
    Je suis content que t'es pu tout comprendre parce que c'etait un peu tordu ^^ Et de rien

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

Discussions similaires

  1. Fonctions, entrée, sortie
    Par Bahan dans le forum C
    Réponses: 6
    Dernier message: 23/05/2006, 09h45
  2. Pointeur sur fonction membre avec parametre
    Par Glosialabolas dans le forum C++
    Réponses: 7
    Dernier message: 06/02/2006, 02h32
  3. pointeur de fonction entre CDialog
    Par firejocker dans le forum MFC
    Réponses: 1
    Dernier message: 19/01/2006, 16h47
  4. Réponses: 6
    Dernier message: 24/12/2004, 16h46

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