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 initialisation char*


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Par défaut fonction initialisation char*
    Bonjour

    J'ai fait une petite fonction "petite(int *longueur,char *retour)" qui est appelée par un fonction principale "principale(void)", or petite initialise correctement retour mais principal me dit que retour est nulle, savez vous comment resoudre ce problème?

    merci d'avance

    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
     
    void petite(int *longueur,char *retour) {
        *longueur = 6;
        retour = new char[*longueur+1];
        if (retour) {
           memset(retour,0,*longueur);
           strcpy(retour,"petite");
        }
        // à ce stade retour="petite\0" et son adresse mémoire est par exemple 0x003b486e
    }
     
    void principale(void) {
        char *tmp_retour=NULL;
        int tmp_longueur=0;
        petite(&tmp_longueur,tmp_retour);
        if (longueur>0) {
            printf("longueur:%d\n",longueur);
            if (tmp_retour) {
                printf("%s\n",tmp_retour);
            }
            else
                printf("tmp_retour est nulle\n");
        }
        else
            printf("longueur est negative ou nulle\n");
    }
    Ca m'incrit à l'écran,
    longueur:6
    tmp_retour est nulle

  2. #2
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut

    Tu devrais :
    1. utiliser std::string ---> cf FAQ
    2. ou faire l'allocation en dehors de ta fonction petite
    3. penser au delete

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Par défaut
    Pour le delete, c'est déjà fait, j'ai juste trop écourté mon exemple pour le forum.

    Pour le type string, je n'y avais pas pensé.

    Pour l'allocation en dehors ce n'est pas possible, sans une certaine petite gymnastique.
    a) je demande la taille de retour à petite
    b) je initialise retour dans principale
    c) je rappelle petite pour "remplir" retour

    Je vais voir pour avec le type string.

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Voici ton exemple modifié

    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
     
    void petite(int *longueur,char *retour) {
        *longueur = 6;
        retour = new char[*longueur+1];
        if (retour) {
           memset(retour,0,*longueur);
           strcpy(retour,"petite");
        }
    	std::cout << "address char*:"<<&retour << std::endl;
     
        // à ce stade retour="petite\0" et son adresse mémoire est par exemple 0x003b486e
    }
    int main (int argc, char** argv)
    {
     
        char *tmp_retour=NULL;
        int tmp_longueur=0;
    	std::cout << "address char*:"<<&tmp_retour << std::endl;
     
        petite(&tmp_longueur,tmp_retour);
        if (tmp_longueur>0) {
            printf("longueur:%d\n",tmp_longueur);
            if (tmp_retour) {
                printf("%s\n",tmp_retour);
            }
            else
                printf("tmp_retour est nulle\n");
        }
        else
            printf("longueur est negative ou nulle\n");
     
    	return 0;
    voici la sortie:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    address char*:0012FF7C
    address char*:0012FF28
    longueur:6
    tmp_retour est nulle
    Press any key to continue
    L'adresse change puisque tu fait un new...

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Bonne idée
    Tu verras ça va te simplifier la vie sur ce genre de problème de flux.

    Bon courage

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 32
    Par défaut
    C'est normal que cela ne fonctionne pas, il ne faut pas passer un pointeur de char mais un pointeur de pointeur (de char) à la fonction petite :

    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
    void petite(int *longueur,char **retour) {
        *longueur = 6;
        *retour = new char[*longueur+1];
        if (retour) {
           memset(retour,0,*longueur);
           strcpy(retour,"petite");
        }
         std::cout << "address char*:"<<retour << std::endl;
    }
     
    void principale(void) {
        char *tmp_retour=NULL;
        int tmp_longueur=0;
        petite(&tmp_longueur,&tmp_retour);
        if (longueur>0) {
            printf("longueur:%d\n",longueur);
            if (tmp_retour) {
                printf("%s\n",tmp_retour);
            }
            else
                printf("tmp_retour est nulle\n");
        }
        else
            printf("longueur est negative ou nulle\n");
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Par défaut
    Merci de vos réponses.

    Celà fonctionne avec un pointeur de pointeur de char.
    Pour ceux que celà interresse voilà le code corrigé, et fonctionnel.

    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
     
    void petite(int *longueur,char **retour) {
        *longueur = 6;
        *retour = new char[*longueur+1];
        if (retour) {
           memset(*retour,0,*longueur);
           strcpy(*retour,"petite");
        }
    }
     
    void principale(void) {
        char *tmp_retour=NULL;
        int tmp_longueur=0;
        petite(&tmp_longueur,&tmp_retour);
        if (tmp_longueur>0) {
            printf("longueur:%d\n",tmp_longueur);
            if (tmp_retour) {
                printf("%s\n",tmp_retour);
                delete tmp_retour;
            }
            else
                printf("tmp_retour est nulle\n");
        }
        else
            printf("longueur est negative ou nulle\n");
    }
    on peut aussi le faire à l'aide du type string.
    Pour ceux que celà interresse voilà le code fonctionnel.

    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 petitebis(std::string* retour) {
        *retour="petite";
    }
     
    void principalebis(void) {
        std::string tmp_retour;
        petitebis(&tmp_retour);
        if (tmp_retour.size()>0) {
            printf("longueur:%d\n",tmp_retour.size());
            printf("%s\n",tmp_retour.c_str());
        }
        else
            printf("longueur est negative ou nulle\n");
    }

  8. #8
    Membre éclairé
    Inscrit en
    Mai 2005
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 73
    Par défaut
    Entre parenthèses, en C++, plutôt que de passer des paramètres à une fonction par adresse, on préfère généralement les passer par référence.
    Du coup, tu pourrait appeler ta fonction "petitebis" de la façon suivante :
    Mais tu pourrais aussi bien renvoyer une string plutôt que de modifier celle passée en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string tmp_retour = petitebis();
    PS : je n'ai volontairement pas détaillé les différentes implémentations de la fonction petitebis, à toi d'essayer afin de te familiariser avec les différentes méthodes.

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

Discussions similaires

  1. Commentaires sur ma fonction isnumber(char *)
    Par GnuVince dans le forum C
    Réponses: 2
    Dernier message: 16/10/2007, 17h40
  2. fonctions de char sur nbre
    Par zdagzdag dans le forum C
    Réponses: 4
    Dernier message: 12/07/2006, 18h03
  3. Quelqu'un connait la fonction _(char *) ?
    Par sdx dans le forum Linux
    Réponses: 3
    Dernier message: 22/06/2006, 12h55
  4. Fonction renvoyant char*
    Par Azharis dans le forum C++
    Réponses: 4
    Dernier message: 28/12/2005, 15h33
  5. Réponses: 1
    Dernier message: 20/08/2004, 09h16

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