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, Structures, tableaux, je ne comprend plus rien...


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Pointeurs, Structures, tableaux, je ne comprend plus rien...
    Salut à tous,

    j'ai le programme suivant:


    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
    30
    31
    32
    typedef struct {
            char *pszCheminCommun;
            char *pszCheminHome;
    } ParametresLocaux;
     
     
    int main(......){
     
       int iRet = 0;
       ParametresLocaux stParametre;
     
       iRet = foo( &stParametre );
     
    }
     
    int foo( ParametresLocaux *pstParametres){
       char szTest[]="TATA|TITI|TOTO";
     
       memset ((void *)pstParametre, (int) NULL, sizeof (ParametresLocaux));
     
       // La ligne suivante (A) ne fonctionne pas
       pstParametre->pszCheminCommun = strtok( szTest, "|" );
     
       // La ligne suivante (B) ne fonctionne pas
       strcpy( pstParametre->pszCheminCommun, strtok( szTest, "|" ) );
     
       // La ligne suivante (C) fonctionne
       pstParametre->pszCheminHome = "Toto";
     
       return 0;
     
    }
    je ne comprend pas pourquoi les lignes A et B ne fonctionnent pas, alors que la ligne C fonctionne ???


    d'avance merci

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 41
    Points : 40
    Points
    40
    Par défaut
    t'es sur que c'est pas ton

    strtok( szTest, "|" )

    qui mer..?

  3. #3
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par JulienT
    t'es sur que c'est pas ton

    strtok( szTest, "|" )

    qui mer..?
    Mouais verifie si le retour n'est pas egal a NULL
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Skyrunner
    Citation Envoyé par JulienT
    t'es sur que c'est pas ton

    strtok( szTest, "|" )

    qui mer..?
    Mouais verifie si le retour n'est pas egal a NULL

    bah comment il pourrait être NULL alors que dans szTest j'ai "TATA|TITI|TOTO" séparé par des "|" ???

  5. #5
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par kameha
    Citation Envoyé par Skyrunner
    Citation Envoyé par JulienT
    t'es sur que c'est pas ton

    strtok( szTest, "|" )

    qui mer..?
    Mouais verifie si le retour n'est pas egal a NULL

    bah comment il pourrait être NULL alors que dans szTest j'ai "TATA|TITI|TOTO" séparé par des "|" ???
    bah je vois bien mais on ne sait jamais pour moi le code est correct alors maintenant p-e que l'appel a strtok echou...
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Une question toute bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    int foo( ParametresLocaux *pstParametres){
    [...]
       // La ligne suivante (A) ne fonctionne pas
       pstParametre->pszCheminCommun = strtok( szTest, "|" );
    [...]
    Le parametre c'est pstParametres

    et apres tu utilises
    pstParametre

    Faute de frappe ou erreur tout court?
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    (B) ne fonctionnera pas car tu copie une chaine dans pszCheminCommun qui n'est pas alloué

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    (A) ne fonctionnera pas car tu mets dans pszCheminCommun
    l'adresse d'une variable locale qui sera detruite a la sortie de la fonction
    foo

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    voici le code corrige

    la variable szTest doit etre declaree comme globale



    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
    30
    31
    32
    33
    34
    35
    36
    37
    #include <stdlib.h>
    #include <string.h>
     
     
    typedef struct { 
            char *pszCheminCommun; 
            char *pszCheminHome; 
    } ParametresLocaux; 
     
     char   szTest[]="TATA|TITI|TOTO";   
    int main(){ 
     
       int iRet = 0; 
       ParametresLocaux stParametre; 
     
       iRet = foo( &stParametre ); 
     
       printf ("pszCheminCommun = %s\n",stParametre.pszCheminCommun); 
       printf (" pszCheminHome= %s\n",stParametre.pszCheminHome  ); 
     
     
    } 
     
    int foo( ParametresLocaux *pstParametres){ 
     
       memset ((void *)pstParametres, (int) NULL, sizeof (ParametresLocaux)); 
     
       // La ligne suivante (A) ne fonctionne pas 
       pstParametres->pszCheminCommun = strtok( (char *)szTest, "|" ); 
     
     
       // La ligne suivante (C) fonctionne 
       pstParametres->pszCheminHome = "Toto"; 
     
       return 0; 
     
    }

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Skyrunner
    Une question toute bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    int foo( ParametresLocaux *pstParametres){
    [...]
       // La ligne suivante (A) ne fonctionne pas
       pstParametre->pszCheminCommun = strtok( szTest, "|" );
    [...]
    Le parametre c'est pstParametres

    et apres tu utilises
    pstParametre

    Faute de frappe ou erreur tout court?
    Faute de frappe...désolé..

  11. #11
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    typedef struct {
            char *pszCheminCommun;
            char *pszCheminHome;
    } ParametresLocaux;
     
     
    int main(......){
     
       int iRet = 0;
       ParametresLocaux stParametre;
     
       iRet = foo( &stParametre );
     
    }
     
    int foo( ParametresLocaux *pstParametres){
       char szTest[]="TATA|TITI|TOTO";
     
       memset ((void *)pstParametre, (int) NULL, sizeof (ParametresLocaux));
     
       // La ligne suivante (A) ne fonctionne pas
       pstParametre->pszCheminCommun = strtok( szTest, "|" );
     
       // La ligne suivante (B) ne fonctionne pas
       strcpy( pstParametre->pszCheminCommun, strtok( szTest, "|" ) );
     
       // La ligne suivante (C) fonctionne
       pstParametre->pszCheminHome = "Toto";
     
       return 0;
     
    }
    Il ne manque pas le prototype de "foo"?

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2005
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 100
    Points : 49
    Points
    49
    Par défaut
    Une autre solution est de declarer la variable locale szTest statique (static)
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
     
     
    typedef struct { 
            char *pszCheminCommun; 
            char *pszCheminHome; 
    } ParametresLocaux; 
     
    static int foo( ParametresLocaux *pstParametres);
    // char   szTest[]="TATA|TITI|TOTO";   
    int main(){ 
     
       int iRet = 0; 
       ParametresLocaux stParametre; 
     
       iRet = foo( &stParametre ); 
     
       printf ("pszCheminCommun = %s\n",stParametre.pszCheminCommun); 
       printf (" pszCheminHome= %s\n",stParametre.pszCheminHome  ); 
     
       return EXIT_SUCCESS;
    } 
     
    int foo( ParametresLocaux *pstParametres){ 
     
     static char   szTest[]="TATA|TITI|TOTO";   
       memset ((void *)pstParametres, (int) NULL, sizeof (ParametresLocaux)); 
     
       // La ligne suivante (A) ne fonctionne pas 
       pstParametres->pszCheminCommun = strtok( (char *)szTest, "|" ); 
     
     
       // La ligne suivante (C) fonctionne 
       pstParametres->pszCheminHome = "Toto"; 
     
       return 0; 
     
    }

  13. #13
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    merci pour vos réponses, ca a fonctionné...

Discussions similaires

  1. je comprend plus rien
    Par hedi_wazo2001 dans le forum Flash
    Réponses: 1
    Dernier message: 19/01/2007, 12h50
  2. Action sur un bouton..Je comprends plus rien du tout!
    Par koolway dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/04/2006, 10h17
  3. Réponses: 4
    Dernier message: 20/04/2006, 14h25
  4. Je n'y comprend plus rien
    Par Pingouinvert dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 11/09/2005, 10h57
  5. [Kylix] Je n'y comprends plus rien
    Par fafamonteko dans le forum EDI
    Réponses: 5
    Dernier message: 02/03/2004, 16h48

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