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 :

Un peu d'aide sur la class string


Sujet :

C++

  1. #1
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut Un peu d'aide sur la class string
    Bonjour

    J'aimerais avoir quelques précisions sur la classe std::string de C++. En fait j'utilise une macro qui retourne une string. Pour récupérer la string dans une variable j'ecris std::string *str = new string(MACRO(parametres)) en utilisant le constructeur par copie. Quand j'ecris simplement std::string = MACRO(parametres) j'ai une violation mémoire (fichiers dbgheap.c et dbgdel.c pour ceux qui ont deja vu ca). Malheureusement je sais pas comment est ecrite la fonction MACRO. Si vous avez une idée de pourquoi la deuxieme solution marche pas?
    Autre chose j'aimerais pouvoir reattribuer ma variable str. J'ai tenté
    str = &(MACRO(nouveaux parametres)) mais ca plante aussi (mais pas tout le temps :s). Je suis assez nul en C++ comme vous vous en doutez en lisant ces lignes alors ne me moquez pas trop vite, merci
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  2. #2
    Membre habitué
    Inscrit en
    Avril 2008
    Messages
    155
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 155
    Points : 158
    Points
    158
    Par défaut
    un petit mot avant d'aller en pause
    pose des bouts de code avec les balises...c'est plus facile a lire car ton post est assez condensé et ca donne pas envie de lire

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    MACRO te renvoie une std::string ou un char*?

  4. #4
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    Bon je reformate un peu mon message. Donc je souhaite récupérer une instance de std::string via une marco qui retourne une string (et pas un char* pour repondre au message précédent). J'écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     std::string *str = new string(MACRO(parametres))
    en utilisant le constructeur par copie. Ca ca marche. En revanche, si j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string = MACRO(parametres)
    ca plante, une alloc qui a pas été faite je présume mais en principe l'alloc a lieu dans la fonction MACRO. Peut-etre dois je déclarer ma variable comme étant une référence sur le retour de la fonction?
    J'aimerais également pouvoir reattribuer ma variable str. J'ai testé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = &(MACRO(nouveaux parametres))
    mais ca plante aussi (mais pas tout le temps :s). Voila si vous avez qq idées et précisions à me fournir sur le fonctionnement précis de la classe String (je préfère la classe String de java ).
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    ta MACRO elle renvoie un std::string, pas un std::string* ?

    alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string str = MACRO( param );
    ça ça ne marche pas?

    les string C++ ne sont pas compliqués. Ce qui est compliqué c'est que tu utilises une MACRO qui a l'air bien pourrie et que tu te mélanges les pinceaux avec les pointeurs ( alors qu'en C++ ils ne sont pas fait pour être utilisés tout le temps ).

    la classe string s'utilise très bien comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string str = "toto";
    std::string str2 = str;
    std::string str3 = str + str2;
     
    std::cout << str3 << std::endl;

  6. #6
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut ben ouai je sais bien
    quand j'ai ecrit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string = MACRO(parametres)
    il fallait bien sur lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str = MACRO(parametres)
    c'est ce que j'avais d'abord écris dans mon code mais comme ca plantait je me suis résolu a faire une allocation dynamique qui elle a fonctionné. Ouai la macro doit etre bien pourrie et elle retourne bien un string pas un string* (d'ou l'emploi du constructeur par copie pour l'alloc dynamique). Mais jcomprends toujours pas pourquoi la première déclaration sans passer par un pointeur marche pas. Et pour réattribuer ma string je suis obligé d'écrire à chaque fois
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    str = new string(MACRO(nouveaux parametres))
    ce qui est bien laid je trouve. Je précise que tt ça s'exécute au sein d'une JNI ca joue peut-être un rôle.. Enfin pour l'instant je comprends pas bien.
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    t'as aucun moyen d'avoir le code de ta MACRO?

  8. #8
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut non malheureusement
    elle est dans une dll. Et c'est pas le premier truc chelou que j'ai avec cette dll d'ailleurs. J'my connais pas très bien en programmation mais plein de trucs ont l'air bizarrement écrit dedans. Bon ben jcrois que jvais rester avec ma solution pourrie à base de pointeurs. Comme quoi du code sale engendre du code sale...
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  9. #9
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut Merci quand meme
    pour tes remarques
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  10. #10
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Une macro ne peut pas être dans une DLL, puisqu'elle est résolue par le préprocesseur et non le compilateur ni l'éditeur de liens.
    Tu devrais donc trouver la macro en question dans le fichier d'en-tête associé à la DLL...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    je pense que tu dois avoir moyen de retrouver ce code, ton compilateur y arrive.
    ( demande lui? )

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Difficile à deviner ce qu'il se passe exactement sans avoir le code de la macro.
    Mais je suppute l'existence de structure conditionnelle (if) dans cette macro, ce qui peut entrainer des comportements indéfinis.

    Un exemple de ce qui peut arriver:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Param{
    Param(/*parametres constructeur*/){/* constructeur */};
    bool constructStrings(){ /* fonction qui va construire les strings str1 et str2 */ };
    string str1, str2;};
     
    #define MACRO ( Param params ) (  ( params.ConstructStrings() ) ? params.str1 : params.str2 ; )
     
    // plus tard dans le code:
    string str = MACRO(  Param(/*parametres du constructeur*/)  );
     
    // regardons ce qu'il se passe: le #define remplace le code, on aura donc:
    string str = ( Param(/*parametres du constructeur*/).ConstructStrings() ) ? Param(/*parametres du constructeur*/).str1 : Param(/*parametres du constructeur*/).str2;
    Dans cet exemple, ça ne plantera pas à l'execution, mais on n'obtiendra pas le résultat escompté.

    Mais je le répète, sans connaitre le contenu de la MACRO, il me parait impossible de comprendre ce qu'il se passe.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  13. #13
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut De plus en plus fort
    Dans la librairie je dispose d'une autre macro pour récupérer une string: AsString comme son nom l'indique. Cette fois la déclaration statique fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::string str = AsString(parametre); //OK
    Mais quand je veux vérifier ce que contient str:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout << "affichage de str: " << str->c_str() << endl;
    n'affiche que "affichage de str: " :s, alors que je sais tres bien ce que str est censé contenir (pas une chaine vide comme ca semble etre le cas). D'ailleurs avec l'autre macro et l'alloc dynamique jaffiche bien qq chose...
    Je crois que jvais écrire un mail au programmeur de la librairie pour récupérer le code. Jcomprends riennnnnnnn
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  14. #14
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Réfléchis un peu aussi avant de poser des questions... tu déclare un objet et tu l'utilises comme un pointeur
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  15. #15
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut non mais g fait du mauvais copié collé des messages précédents
    j'ai bien ecris [CODE]cout << "affichage: "<< str2.data() << endl;/CODE] dans mon code. J'aurais eu un problème à la compilation sinon. Je suis nul mais pas à ce point la quand même. Je confirme ce que j'ai dit avant donc..
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  16. #16
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut ref medinoc
    je n'avais pas vu ta remarque. En fait aprés vérification c'est pas une macro au sens C/C++ mais au sens général du terme donc ce n'est en fait qu'une fonction dont j'ai uniquement le prototype dans le .h
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  17. #17
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Bon, je sais, il semble qu'on se répète, mais peut-on voir le code de MACRO stp ? Sans cette information, il est impossible de savoir ce qui se passe.

    Pour ma part, je penche pour un problème de modèle de mémoire. Le standard C++ ne définit pas d'ABI (abstract binary interface). De fait, les compilateurs sont libres de gérer la mémoire comme ils le souhaite dans les différents modules. Si une DLL utilise un modèle de mémoire différent du programme appelant, alors il est impossible de garantir le fonctionnement d'un programme qui va détruire ce qui aura été créé par la DLL.

    Ce qui pose problème pour les templates, car dans la plupart des cas le code du template est directement inséré là ou il est utilisé (il est "inliné"). De fait, si ta MACRO est (contrairement à son nom) une fonction qui crée une std::string, il ne faut pas que cette chaine soit détruite dans le programme appelant, car le destructeur sera directement inséré dans le code de l'appelant (et non pas dans la DLL). Si il y a ne serait-ce qu'une petite différence dans le modèle de mémoire, la pile ou le tas risquent fortement d'être corrompu.

    Cependant, tout ceci ne reste que pure spéculation: tant que nous ne savons pas exactement ce que fait MACRO (c'est à dire tant que nous ne voyons pas son code), il nous est impossible de trouver une solution à ton problème.

    Donc cherche dans les .h et livre nous les informations nécessaires - tu verras, nous allons être un brin plus efficace après ça
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  18. #18
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Il ne faut pas passer de std::string en entrée ou en sortie d'une DLL, c'est au mieux très dangereux et au pire ça fait n'importe quoi (un peu comme là quoi )...
    Cf. C++, the real world, and link and binary compatibility.

    MAT.

  19. #19
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut Merci pour ces réponses
    qui commencent à m'éclairer un peu. Si je peux pas passer std::string en sortie d'une fonction d'une DLL comment puis-je récupérer l'objet renvoyé par cette fonction? Jvais voir si jtrouve une réponse dans le lien que tu as donné. Le code de la fonction je l'ai pas pour l'instant malheureusement
    La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
    Donald E. Knuth

  20. #20
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Citation Envoyé par KindPlayer Voir le message
    Le code de la fonction je l'ai pas pour l'instant malheureusement
    Tu dois avoir au moins la signature de cette fonction, dans un des .h fourni avec la DLL, elle ressemble à quoi ?

    MAT.

Discussions similaires

  1. Un peu d'aide sur une expression régulière particulier
    Par ruana dans le forum Général Python
    Réponses: 2
    Dernier message: 03/06/2007, 19h04
  2. [stl] questions sur la classe string
    Par r0d dans le forum SL & STL
    Réponses: 3
    Dernier message: 23/02/2007, 00h31
  3. Question facile sur la classe string
    Par MarOne dans le forum Langage
    Réponses: 9
    Dernier message: 20/04/2006, 14h28
  4. Aide sur POO :: Classe et liste d'objet
    Par Andry dans le forum Langage
    Réponses: 1
    Dernier message: 23/01/2006, 15h51
  5. svp un peu d'aide sur mon update, resumé simple en dessous
    Par hansaplast dans le forum Langage SQL
    Réponses: 11
    Dernier message: 14/11/2005, 10h14

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