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++/CLI Discussion :

Problem entres System::string et char*


Sujet :

C++/CLI

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 31
    Points
    31
    Par défaut Problem entres System::string et char*
    Salut,

    Alors voici mon problème j'utilise une OpenFileDialog (Parcourir)pour permette a l'utilisateur de choisir un fichier. Je récupéré le patch du fichier dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                   System::String^ Patch;
     
                    Parcourire->ShowDialog();
    		Patch = Parcourire->FileName; 
    		textBox1->Text =Patch;
    Le chemin complet s’affiche bien dans mon textbox mais pour la suite du programme jais besoin d'utiliser le patch du fichier via un char * seulement impossible de convertir ce System::String en char* et le code suivant ne fonctionne pas car il n'ouvre jamais le bon fichier (jais l’impression que la variable Patchchar contient n’importe quoi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //Conversion du System::string en char *  pour le fopen
    		pin_ptr<const wchar_t> wch = PtrToStringChars(Patch);
    		size_t convertedChars = 0;
    		size_t  sizeInBytes = ((Patch->Length + 1) * 2);
    		errno_t err = 0;
    		Patchchar = (char *)malloc(sizeInBytes);
    Merci d'avance

  2. #2
    Membre éclairé Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Points : 790
    Points
    790
    Par défaut
    il n'y a pas une methode c_str() ? Tu ferais Patch.c_str() ...

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    ¨Merci pour la réponse mais avec patchchar=Patch.c_str(); j'obtient l'erreure suivante :

    la partie gauche de '.c_str' doit avoir un class/struct/union
    ps: je travaille sur une version expresse 2010 donc pas d'Intellisense

  4. #4
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Farow Voir le message
    Petit coquin, tu ne serais pas en train de nous faire du C++ managé ? Je ne sais pas comment fonctionne ce type de référence (déclaré avec un ^ après le type), donc je ne peux pas t'aider, mais je dirais que tu devrais essayer Patch -> c_str() au lieu de Patch.c_str().
    Find me on github

  5. #5
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Du C++ managé ? c'est quoi exactement j'utilise Visual studio et la boite à outils.

    En gros je veut que l'utilisateur choisisse un fichier équivalent a un fichier texte et mon programme ajoute du texte a l’intérieure du fichier avec un fopen et un fwrite.

    Seulement le problème est que pour récupéré le chemin avec un Openfailedialog jais besoin d'une String^ sinon j'obtient :

    String'*: impossible d'utiliser ce type ici sans '^' de niveau supérieur
    Et que fopen/fwrite a besoin du chemin dans un char*. Sinon tu connait une méthode peut-être plus simple pour ouvrir et inséré du texte dans un fichier de type txt avec une sélection via Openfailedialog. ?

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Farow Voir le message
    Du C++ managé ? c'est quoi exactement j'utilise Visual studio et la boite à outils.
    Le diable m'emporte si je sais exactement ce que c'est. C'est une sorte d'extension du langage C++ par Microsoft.

    En revanche, ce dont je suis certain, c'est que String^ n'est pas un type C++ mais une référence en C++ managé, et ça implique beaucoup de choses que visiblement tu ne maîtrises pas (ni moi non plus d'ailleurs).

    Il faut chercher une manière de faire en C++ pur. Regarde cet exemple.

    Edit : le C++ managé, c'est ça.
    Find me on github

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Heu je vien de me dire que le problème vien peut-être du namespace je travaille dans From.h et dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    {
    ..............
    }
    Avec ce code en haut de la page :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    namespace GPs_edit_pos {
     
    	using namespace System;
    	using namespace System::ComponentModel;
    	using namespace System::Collections;
    	using namespace System::Windows::Forms;
    	using namespace System::Data;
    	using namespace System::Drawing;
    Bref si quelqun a une idee j'avou etre un peut perdue la je suis développeur PHP/javascript alors le C++ c'est un peut l’inconnue pour moi xD

    Merci

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2011
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Le diable m'emporte si je sais exactement ce que c'est. C'est une sorte d'extension du langage C++ par Microsoft.

    En revanche, ce dont je suis certain, c'est que String^ n'est pas un type C++ mais une référence en C++ managé, et ça implique beaucoup de choses que visiblement tu ne maîtrises pas (ni moi non plus d'ailleurs).

    Il faut chercher une manière de faire en C++ pur. Regarde cet exemple.

    Edit : le C++ managé, c'est ça.
    AAAAAAAAhhhhhhh merci effectivement je suis en C++/CLI je pense que je me suis tromper dans le type de projet au début j'ais pris Application Windows form. Je pense que c'est Projet Win32 qu'il faut choisir non?? Cela va résoudre mon problème si je recommence avec le bon type de projet à votre avis ??

  9. #9
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Citation Envoyé par Farow Voir le message
    Je pense que c'est Projet Win32 qu'il faut choisir non?? Cela va résoudre mon problème si je recommence avec le bon type de projet à votre avis ??
    Résoudre ton problème, n'exagérons pas, mais en tout cas, ça va t'aider à repartir sur les bonnes bases oui, ça c'est sûr

    Ca ne résoudra pas directement l'erreur puisque les handlers (type suivi d'un ^) n'existent pas en C++. Tu peux essayer mon exemple par contre.
    Find me on github

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    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 069
    Points : 12 113
    Points
    12 113
    Par défaut
    Vous ne connaissez pas le C++/CLI mais vous codez un truc comme :
    pin_ptr<const wchar_t> wch = PtrToStringChars(Patch);
    Vous êtes en train de faire le l'interopérabilité entre du code managé (attention le C++ managé n'existe plus, c'était l'ancêtre du C++/CLI) et du code non managé ou natif.
    C'est la partie la plus délicate du C++/CLI.
    C'est comme manipulé de la nitroglycérine et sachant vaguement ce qu'est une mèche court pour un bâton de dynamite : le début de grosses désillusions.

    Votre tâche est trivial en C++ standard ou en C++/CLI alors ne les mélanger pas.

    Pour la version C++ standard voir le lien du post de jblecanard.
    Pour du C++/CLI, pour lire un fichier texte : http://msdn.microsoft.com/fr-fr/library/bsy4fhsa.aspx

    Mais il existe bien d’autres moyens plus pratiques en C++/CLI en fonction du format du fichier à ouvrir.

    PS:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Patchchar = (char *)malloc(sizeInBytes);
    C'est bien beau d'allouer de la RAM, mais faudrait peut-être l'initialiser avec la valeur de la chaîne, et de préférence en utilisant des chaines UNICODE et non ASCII car les primitives systèmes natives n'utilisent que cette version.

Discussions similaires

  1. Conversion System::String ^ en char *
    Par betedesvosges dans le forum C++/CLI
    Réponses: 2
    Dernier message: 27/05/2015, 17h50
  2. Réponses: 1
    Dernier message: 16/03/2007, 15h28
  3. convertir un System::String* en char *
    Par poporiding dans le forum C++
    Réponses: 4
    Dernier message: 26/07/2006, 17h01
  4. Réponses: 3
    Dernier message: 14/06/2006, 10h06
  5. Réponses: 12
    Dernier message: 31/01/2006, 21h46

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