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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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 averti
    Inscrit en
    Juin 2005
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 56
    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 actif
    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
    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 éprouvé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 103
    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 éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    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 actif
    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
    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 éclairé
    Inscrit en
    Avril 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Avril 2010
    Messages : 66
    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