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

MFC Discussion :

Retour d'une chaine grace à une fonction


Sujet :

MFC

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Par défaut Retour d'une chaine grace à une fonction
    Bonjour.
    Je suis étudiant en BTS IRIS et nous travaillons à mon grand plaisir avec Visual C++.
    J'ai un petit programme a faire en TP je suis à 2 doigts de finaliser celui-ci mais il y a encore quelquechose qui me pose problème.
    Il s'agit de retourner une chaine de caractère que l'on obtiens d'une fonction
    J'ai donc fait mes recherches et j'ai trouvé ceci dans les FAQ de ce site :
    FAQ C - Section sur les fonctions
    Comment créer une fonction qui retourne une chaîne de caractères ?
    auteurs : Bob, LFE

    Pour retourner une chaîne de caractères, il faut passer à la fonction un pointeur en paramètres et copier la chaîne dans la zone mémoire pointée (avec strcpy() par ex.).

    Une autre façon de faire est de déclarer la fonction comme retournant un pointeur sur des caractères et d'allouer la mémoire dans la fonction sans la libérer dans celle-ci, mais dans la fonction appelante.
    Voici d'autre part des extraits de mon code qui constitue une application en mode console :
    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
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
     
    int main(void)
    {
    	// Il s'agit là du code qui me permet de tester ma fonction
    	int aff;
    	char mot[2];
    	char *pmot = &mot[0];
    	cout << "Aff : " << endl;
    	cin >> aff ;
    	pmot = affecte(aff);
     
    	cout << *pmot << *(pmot+1);
     
    	getch();
    	return 0;
    }
     
    char *affecte(int reste)
    {
    	char	syllabe[2];
    	char	*psyllabe = &syllabe[0];
     
    	switch (reste)
    	{
    	case 0 :
    		*psyllabe = 'H';
    		*(psyllabe+1) = 'o';
    		break;
    	case 1 :
    		*psyllabe = 'H';
    		*(psyllabe+1) = 'a';
    		break;
    	case 2 :
    		*psyllabe = 'H';
    		*(psyllabe+1) = 'e';
    		break;
    	case 3 :
    		*psyllabe = 'H';
    		*(psyllabe+1) = 'i';
    		break;
    	case 4 :
    		*psyllabe = 'B';
    		*(psyllabe+1) = 'o';
    		break;
    	case 5 :
    		*psyllabe = 'B';
    		*(psyllabe+1) = 'a';
    		break;
    	case 6 :
    		*psyllabe = 'B';
    		*(psyllabe+1) = 'e';
    		break;
    	case 7 :
    		*psyllabe = 'B';
    		*(psyllabe+1) = 'i';
    		break;
    	case 8 :
    		*psyllabe = 'K';
    		*(psyllabe+1) = 'o';
    		break;
    	case 9 :
    		*psyllabe = 'K';
    		*(psyllabe+1) = 'a';
    		break;
    	case 10 :
    		*psyllabe = 'K';
    		*(psyllabe+1) = 'e';
    		break;
    	case 11 :
    		*psyllabe = 'K';
    		*(psyllabe+1) = 'i';
    		break;
    	case 12 :
    		*psyllabe = 'D';
    		*(psyllabe+1) = 'o';
    		break;
    	case 13 :
    		*psyllabe = 'D';
    		*(psyllabe+1) = 'a';
    		break;
    	case 14 :
    		*psyllabe = 'D';
    		*(psyllabe+1) = 'e';
    		break;
    	case 15 :
    		*psyllabe = 'D';
    		*(psyllabe+1) = 'i';
    		break;
    	default :
    		*psyllabe = 'x';
    	}
     
    	cout << "Syllabe : " << psyllabe << endl; // DEBUG // */
     
    	return psyllabe ;
    }
    J'ai suivi l'exemple d'un livre sur C++ que je possède chez moi mais ça ne donne rien de convainquant.

    Quand je vérifie ma chaine avant de la retourner elle est comme je le désir. (Notez au passage la manière un peu idiote d'affecter la chaine de caractère mais c'est venu des resultats que j'ai pu avoir avec la valeur testée)

    Problème il ne reste plus que le 1er caractère dans mon main. J'ai pensé à un problème de portée mais j'ai appliqué la même logique que l'exemple que j'ai tiré du manuel dont je parle plus haut, mon professeur a misé sur un mauvais positionnement du caractère NULL ( I mean \0). Quelqu'un pourrait-il m'expliquer le pourquoi (ça ne marche pas) et le comment (appliquer corrèctement le principe cité dans la FAQ - Qu'ai-je mal fait ? -) ?

    D'avance merci.

  2. #2
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    salut,
    la question est de savoir ou tu te situe dans le langage :
    tu fais du C ou du C++ ?
    si c'est du c++ il serait beaucoup de voir ça avec l'objet string...

    bon sinon dans ton code tu te torture la tete il n'y a pas trop d'interet de declarer un pointeur sur une chaine pour acceder a ses elements:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char mot[2];
       char *pmot = &mot[0];
    tu peux faire mot[0] ou mot[1]...

    pour ta fonction affecte, tu tombes dans le piege du debutant en C, tu retournes l'adresse d'une variable (syllabe) située dans la pile d'une fonction .
    quand on sort de la fonction la pile est nettoyée syllabe n'est plus valide
    donc ton retour (psyllabe) est incorrect et provoquera une erreur.
    pour retouner l'adresse d'une chaine declarée dans une fonction celle ci doit etre déclarée static:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static char syllabe[2];
    autre chose si tu envois psyllabe dans cout celle ci doit se terminée par un
    \0
    donc syllabe doit posséder 3 caracteres pour la place pour le zero
    sinon probleme ....
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static char syllabe[3];
    autre option tu peux (comme signalé dans la faq C ) declarer un pointeur et allouer de l'espace mémoire,
    le pointeur sera bien nettoyé en sortant de la fonction mais la zone memoire allouée existera toujours.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *syllabe=new char [3];
    syllabe[2]=0;
    il faudra faire un delete [] de cette adresse pour liberer la zone...

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Par défaut
    Ok c'est ce à quoi je pensais pour le "allouer de la mémoire". On fait encore du c without classes. (en référence au premier nom de C++ : C with classes)

    Je vais essayer les propositions que tu me donnes.

    pour ta fonction affecte, tu tombes dans le piege du debutant en C, tu retournes l'adresse d'une variable (syllabe) située dans la pile d'une fonction .
    quand on sort de la fonction la pile est nettoyée syllabe n'est plus valide
    C'est donc bien ce que je pensais : un problème de portée.

    Pour les chaines de caractères on sait qu'il faut les terminer avec le caractère NULL (\0) dans mon cas syllabe[2] quand je déclare une chaine le nombre entre crochet est en logique humaine ou informatique ? Dans ma tête syllabe[2] c'est déclarer un tableau qui peut avoir les indices 0, 1 et 2 donc par besoin de s'ennuyer avec le calcul du \0. Je vois que je me suis trompé donc je déclare syllabe[3] ( 3 caractères dans la chaine avec NULL compris)

    Bon merci ça marche. Pas étonnant quand on est Most Valuable Professionnal, ça doit faire plaisir. Je ne met pas encore le tag [RESOLU] si certaines personnes voudraient apporter d'autres éléments à ce sujet. J'imagine qu'il y a d'autres choses à observer et à comprendre. Quelqu'un veut-il partager son expérience en la matière ?

    Merci

  4. #4
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par K0mpu73rn1kDaCS
    Ok c'est ce à quoi je pensais pour le "allouer de la mémoire". On fait encore du c without classes. (en référence au premier nom de C++ : C with classes)

    Je vais essayer les propositions que tu me donnes.

    pour ta fonction affecte, tu tombes dans le piege du debutant en C, tu retournes l'adresse d'une variable (syllabe) située dans la pile d'une fonction .
    quand on sort de la fonction la pile est nettoyée syllabe n'est plus valide
    C'est donc bien ce que je pensais : un problème de portée.

    Pour les chaines de caractères on sait qu'il faut les terminer avec le caractère NULL (\0) dans mon cas syllabe[2] quand je déclare une chaine le nombre entre crochet est en logique humaine ou informatique ? Dans ma tête syllabe[2] c'est déclarer un tableau qui peut avoir les indices 0, 1 et 2 donc par besoin de s'ennuyer avec le calcul du \0. Je vois que je me suis trompé donc je déclare syllabe[3] ( 3 caractères dans la chaine avec NULL compris)

    Bon merci ça marche. Pas étonnant quand on est Most Valuable Professionnal, ça doit faire plaisir. Je ne met pas encore le tag [RESOLU] si certaines personnes voudraient apporter d'autres éléments à ce sujet. J'imagine qu'il y a d'autres choses à observer et à comprendre. Quelqu'un veut-il partager son expérience en la matière ?

    Merci
    re,
    non syllabe[2] ,veux dire deux elements ,l'indicage commence toujours à 0 ,donc [0,1] ...

  5. #5
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Par défaut
    Donc ma logique est juste si je comprend bien.

    Si je déclare syllabe[2] j'ai bien accès syllabe[0], syllabe[1] et syllabe[2].

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Par défaut
    Citation Envoyé par K0mpu73rn1kDaCS
    Donc ma logique est juste si je comprend bien.

    Si je déclare syllabe[2] j'ai bien accès syllabe[0], syllabe[1] et syllabe[2].
    argh non 2 elements,l'indicage commence toujours à 0 donc [0,1]. sinon ça fait 3 elements !

  7. #7
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 5
    Par défaut
    OK merci bien alors.

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

Discussions similaires

  1. recherche d'une chaine dans une chaine
    Par jpclutier dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 03/12/2007, 11h30
  2. comment supprimer une chaine d'une chaine?
    Par Philippe PONS dans le forum Framework .NET
    Réponses: 3
    Dernier message: 28/05/2007, 10h47
  3. Tester une chaine dans une chaine
    Par ulysse031 dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 26/03/2007, 00h48
  4. chercher caractére d'une chaine dans une chaine
    Par ulysse031 dans le forum Langage
    Réponses: 25
    Dernier message: 21/03/2007, 18h09
  5. Réponses: 2
    Dernier message: 19/10/2005, 15h38

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