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 :

Retour d'une fonction simple *char


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : Mars 2006
    Messages : 85
    Points : 95
    Points
    95
    Par défaut Retour d'une fonction simple *char
    Je dois faire un fonction qui retourne un *char. Je suis un train de faire un prototype simple pour après faire une dll qui aura toute la fonctionalité.

    Le pb est le suivant:

    Si je charge le *char avec un string défini comme "constant" le retour est correcte. Option intLen = 0 ou 2.
    Si je charge le *char avec un string défini comme variable le retour est vide. Option intLen = 1.

    Je lu les FAQ et aussi deux fois le chapitre 3 de Bruce Eckel, sans résultat.

    Je fais certainement une bêtisse qui m'échappe.

    Je passe le code du main qui fait l'appel et de la fonction. Enviro: Win7 et VC++ 6 de MS.

    Merci bien et bonne journée!

    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
     
    /*****************************************************************************
    Routine returns a char CPTR
    */
    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
     
    char*  Text(int intLen);
     
    void main()
    {
    int intCount=0;
     
    intCount=0;
    cout << "Entrar un entero (de 0 a 25)" << endl;
    cout << "Entrar 26 o mas para salir" << endl;
    cin >> intCount;
     
    while (intCount < 26) {
     
    cout << "intCount = " << endl;
    cout << "**************************************" << endl;
    cout << "str Returned = " << Text(intCount)  << endl;
    cout << "Entrar un entero (de 0 a 25)" << endl;
    cout << "Entrar 26 o mas para salir" << endl;
    cin >> intCount;
    }
     return;
    }
     
    char*  Text(int intLen)
    {
    char* str;
    char aS[2][10]={
    				{'Q','u','e','r','y'},
    				{'S','M','a','g','i','c'}};
    cout << "Q: " << strlen(aS[0]) << endl;
    cout << "Q: " << strlen(aS[1]) << endl;
    char* pStr[5] ={	"Query text zero",
    				"Query text one",
    				"Query text two",
    				"Query text three",
    				"Query text four" };
    char* u = const_cast<char*>(aS[0]);
    cout << "u hex: " <<  &u << endl;  //displays Addr Ok
    cout << "u content: " <<  u << endl; //displays "Query" Ok
     
    	switch (intLen)  {
    	case 1:			// Fails: does not display "Query"!
    		return u; 
    	case 2:			// Ok displays "Query text two",
    		str = pStr[2];
    		return str;
    	default:		// Ok displays "Query text zero",
    		str = pStr[0];
    		return str;
    	}
    }

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    A mon avis, il suffit de mettre le tableau de char en static.
    Apparemment, vous mélangez allègrement les style d'écriture du C et du C++. Ca va pas plaire à tout le monde sur ce forum.
    D'autre part, je n'ai pas très bien compris ce que fait votre fonction. Je suppose que les impressions sont là pour vérification, mais vous parlez déjà de faire une DLL qui pourra tout faire.

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    D'abord avec la balise , c'est plus simple pour lire le code.

    Ensuite, tu retourne une chaine de caractère qui est une variable locale à ta fonction.

    Lorsque tu quittes la fonction, la variable locale est invalide et le pointeur retourné pointe sur une zone de mémoire "invalidée".

    Dans ce cas de figure, tu as plusieurs options possibles :
    • passer ta variable locale char * en static char * afin que la zone mémoire reste valide lorsque tu quittes la fonction. Cette solution n'a de sens que si c'est variable locale n'est pas modifiée (ce qui semble être la cas après lecture en diagonale de ton code)
    • faire en sorte que ta fonction fasse un malloc et retourne la zone allouée. Attention, il ne faut pas que l'appelant oublie de libérer la mémoire sinon, il y a des fuites.
    • c'est l'appelant qui passe une zone de mémoire à ta fonction en paramètre et la fonction appelée utilise uniquement cette zonne de mémoire
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    faire en sorte que ta fonction fasse un malloc et retourne la zone allouée. Attention, il ne faut pas que l'appelant oublie de libérer la mémoire sinon, il y a des fuites.
    Si l'appelant n'utilise pas la même C-Runtime que la dll, ça va faire des étincelles.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 367
    Points
    50 367
    Par défaut
    Citation Envoyé par bacelar Voir le message
    faire en sorte que ta fonction fasse un malloc et retourne la zone allouée. Attention, il ne faut pas que l'appelant oublie de libérer la mémoire sinon, il y a des fuites.
    Si l'appelant n'utilise pas la même C-Runtime que la dll, ça va faire des étincelles.
    C'est vrai, je n'avais pas vu que cela devait aller dans une DLL. Dans ce cas, prévoir une fonction de liberation dans la DLL.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Argentine

    Informations forums :
    Inscription : Mars 2006
    Messages : 85
    Points : 95
    Points
    95
    Par défaut Merci !
    Merci Pierre et Raymond pour vos réponses.

    Passer en static a résolu le pb. immédiatement.

    La solution de malloc puis libérer dans l'appellant je doute que soit possible, parce que l'appellant final est un Paradox, et je ne suis pas certain que Pdox puisse fair une manip. mémoire. Je verrai.

    La troisième je pense c'est possible.

    Désolé pour ne pas "faire plaisir" mais si j'écris dans ce forum c'est bien évidemment parce que je suis débutant. Donc je me sens seulement obligé de respecter les normes et m'efforcer pour respecter aussi votre belle et riche langue française.

    Merci encore!

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

Discussions similaires

  1. retour d'une fonction
    Par papy_tergnier dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 15/05/2006, 17h21
  2. [XML][XSLT][debutant]retour d'une fonction
    Par maxvador dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 30/03/2006, 14h12
  3. recuperer en php le retour d'une fonction plsql
    Par gismoblue dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/03/2006, 16h39
  4. PL/SQL retour d'une fonction
    Par aaronw dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/12/2005, 13h25
  5. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54

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