Ĺadny brzuch
Jak w temacie, czy da się przekonwertować System::String^ na std::string, ew. tablicę char?
System::String jest już niezależnym typem w .NET, a nie jak std::string mobilną klasą złożoną z tablicy charów. W każdym razie istnieje możliwośc konwersji opisana np tutaj:
http://blogs.msdn.co.../02/147090.aspx
Ale nie próbowałem, i pewnie nie spróbuje bo w C++.NET się nie bawię ;) wolę C# :P
Użytkownik reVis edytował ten post 03 wrzesień 2006, 22:10
Dzięki. A czy da się na odwrót, tj std::string na System::String?
Próbowałem funkcji c_str() klasy std::string, ale nie działa. Występuje błąd
c:\documents and settings\lampak\moje dokumenty\visual studio 2005\projects\moj_projekt\moj_projekt\ust_regul.h(1622) : error C2664: 'void System::Windows::Forms::Control::Text::set(System:: String ^)' : cannot convert parameter 1 from 'const char *' to 'System::String ^' No user-defined-conversion operator available, or Cannot convert an unmanaged type to a managed type
EDIT: występują błędy podczas kompilacji kodu obu funkcji pod wsikazanym przez ciebie adresem. Obydwa błędy są identyczne i pojawiają się w linijkach, w których używana jest funkcja wcstombs. Aby nie śmiecic przedstawiam tylko jeden egzemplarz:
c:\documents and settings\lampak\moje dokumenty\visual studio 2005\projects\moj_projekt\moj_projekt\funkcje_net.h(16) : warning C4996: 'wcstombs' was declared deprecated D:\Microsoft Visual Studio 8\VC\include\stdlib.h(562) : see declaration of 'wcstombs' Message: 'This function or variable may be unsafe. Consider using wcstombs_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
Użytkownik lampak edytował ten post 05 wrzesień 2006, 16:22
Wieczorem sobie zainstaluję VC++.Net to popróbuję :P . Narazie mogę powiedzieć, że część problemu może być związana z uznaniem wskaźników jako "niebezpiecznych". Ale nie jestem pewien jak z tym jest w C++.Net, tak jest w C# :) (w końcu trudno wyobrazić sobie C++ bez wskaźników, C# można użyć dla nich trybu unsafe). Co do System::String^ -> std::string spróbuj wykorzystać zamiast wcstombs, wcstombs_s tak jak radzi błąd. Tyle narazie...
//Edit
Posprawdzałem parę rzeczy... i wszystko co znalazłem w interneci powodowało podobne błędy jak u Ciebie (i nie udało mi się ich wyeliminować). Ale sam wpadłem na prosty choć możę nie profesjonalny sposób jak wykonać taką konwersję :) :
#include <string> #include <iostream> //... std::string ToStdString(System::String^ source) { std::string result; int len = source->Length; for(int i=0; i<len; i++) result += (char)source[i]; return result; } System::String^ ToSysString(std::string source) { System::String^ result; int len = (int)source.length(); for(int i=0; i<len; i++) result += (wchar_t)source[i]; return result; } int main(array<System::String ^> ^args) { std::string stdString = "jakis tam napisa z uzyciem std::string"; System::String^ sysString = "inny napis z uzyciem System::String^"; std::cout << ToStdString(sysString) << std::endl; Console::WriteLine("{0}", ToSysString(stdString)); return 0; }
I tak działa bez zarzutu :P
PS. coraz bardziej utwierdzam się w przekonaniu, że C++ w .Net to porażka :)
Użytkownik reVis edytował ten post 05 wrzesień 2006, 22:01
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
System::String jest już niezależnym typem w .NET, a nie jak std::string mobilną klasą złożoną z tablicy charów. W każdym razie istnieje możliwośc konwersji opisana np tutaj:
http://blogs.msdn.co.../02/147090.aspx
Ale nie próbowałem, i pewnie nie spróbuje bo w C++.NET się nie bawię ;) wolę C# :P
Użytkownik reVis edytował ten post 03 wrzesień 2006, 22:10
Dzięki. A czy da się na odwrót, tj std::string na System::String?
Próbowałem funkcji c_str() klasy std::string, ale nie działa. Występuje błąd
c:\documents and settings\lampak\moje dokumenty\visual studio 2005\projects\moj_projekt\moj_projekt\ust_regul.h(1622) : error C2664: 'void System::Windows::Forms::Control::Text::set(System:: String ^)' : cannot convert parameter 1 from 'const char *' to 'System::String ^' No user-defined-conversion operator available, or Cannot convert an unmanaged type to a managed type
EDIT: występują błędy podczas kompilacji kodu obu funkcji pod wsikazanym przez ciebie adresem. Obydwa błędy są identyczne i pojawiają się w linijkach, w których używana jest funkcja wcstombs. Aby nie śmiecic przedstawiam tylko jeden egzemplarz:
c:\documents and settings\lampak\moje dokumenty\visual studio 2005\projects\moj_projekt\moj_projekt\funkcje_net.h(16) : warning C4996: 'wcstombs' was declared deprecated D:\Microsoft Visual Studio 8\VC\include\stdlib.h(562) : see declaration of 'wcstombs' Message: 'This function or variable may be unsafe. Consider using wcstombs_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
Użytkownik lampak edytował ten post 05 wrzesień 2006, 16:22
Wieczorem sobie zainstaluję VC++.Net to popróbuję :P . Narazie mogę powiedzieć, że część problemu może być związana z uznaniem wskaźników jako "niebezpiecznych". Ale nie jestem pewien jak z tym jest w C++.Net, tak jest w C# :) (w końcu trudno wyobrazić sobie C++ bez wskaźników, C# można użyć dla nich trybu unsafe). Co do System::String^ -> std::string spróbuj wykorzystać zamiast wcstombs, wcstombs_s tak jak radzi błąd. Tyle narazie...
//Edit
Posprawdzałem parę rzeczy... i wszystko co znalazłem w interneci powodowało podobne błędy jak u Ciebie (i nie udało mi się ich wyeliminować). Ale sam wpadłem na prosty choć możę nie profesjonalny sposób jak wykonać taką konwersję :) :
#include <string> #include <iostream> //... std::string ToStdString(System::String^ source) { std::string result; int len = source->Length; for(int i=0; i<len; i++) result += (char)source[i]; return result; } System::String^ ToSysString(std::string source) { System::String^ result; int len = (int)source.length(); for(int i=0; i<len; i++) result += (wchar_t)source[i]; return result; } int main(array<System::String ^> ^args) { std::string stdString = "jakis tam napisa z uzyciem std::string"; System::String^ sysString = "inny napis z uzyciem System::String^"; std::cout << ToStdString(sysString) << std::endl; Console::WriteLine("{0}", ToSysString(stdString)); return 0; }
I tak działa bez zarzutu :P
PS. coraz bardziej utwierdzam się w przekonaniu, że C++ w .Net to porażka :)
Użytkownik reVis edytował ten post 05 wrzesień 2006, 22:01