Cannot convert 'char *' to 'const wchar_t *'

dział ogólny

Cannot convert 'char *' to 'const wchar_t *'

Nowy postprzez continue » piątek, 26 lutego 2010, 06:31

Posiadam C++ 2009 RAD i problem polega na tym że w Większość projektów wyskakuje następujący błąd:

Kod: Zaznacz cały
[BCC32 Error] Langcb.cpp(192): E2034 Cannot convert 'char *' to 'const wchar_t *'
[BCC32 Error] Langcb.cpp(192): E2342 Type mismatch in parameter 'Text' (wanted 'const wchar_t *', got 'char *')
[BCC32 Error] Langcb.cpp(199): E2034 Cannot convert 'char *' to 'const wchar_t *'
[BCC32 Error] Langcb.cpp(199): E2342 Type mismatch in parameter 'Text' (wanted 'const wchar_t *', got 'char *')
[BCC32 Error] Langcb.cpp(220): E2034 Cannot convert 'char *' to 'const wchar_t *'
[BCC32 Error] Langcb.cpp(220): E2342 Type mismatch in parameter 'Text' (wanted 'const wchar_t *', got 'char *')


i nie kompiluje !!! Problem pojawił się gdy odinstalowałem C++ i zainstalowałem ponownie, a przed reinstalacją wszystko było w porządku!
Podobny problem pojawił się też w Delphi 2009.

Patrz Tu ------->
► 
Obrazek Obrazek ObrazekObrazek
Avatar użytkownika
continue
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): piątek, 12 lutego 2010, 09:20
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder Rad sudio 2009
Delphi 2009
Gadu Gadu: 0
    Windows XPInternet Explorer 6

Re: Cannot convert 'char *' to 'const wchar_t *'

Nowy postprzez Cyfrowy Baron » piątek, 26 lutego 2010, 10:39

Problem pojawił się gdy odinstalowałem C++ i zainstalowałem ponownie, a przed reinstalacją wszystko było w porządku!


Nie mogło być w porządku. C++Builder 2009 i 2010 operuje domyślnie na zmiennych typu UnicodeString i wchar_t a nie jak we wcześniejszych wersjach na AnsiString i char, więc konwersja stosowana do AnsiString nie zadziała w nowszych wersjach. Do konwersji UnicodeString do wchar_t należy użyć w_str(), a nie c_str(), a do konwersji char do wchar_t należy użyć L

W C++Builder 2007 i starszych Appllication->MessageBox oczekiwało argumentów typu:

Kod: Zaznacz cały
Application->MessageBox( const char *Text, const char *Caption, int Flags);


W C++Builder 2009 i 2010 oczekuje argumentów typu:

Kod: Zaznacz cały
Application->MessageBox( const wchar_t *Text, const wchar_t *Caption, int Flags);


W C++Buider 2007 i starszych ten ten komunikat mógł wyglądać tak:

Kod: Zaznacz cały
Application->MessageBox( ("Tekst" + Edit1->Text).c_str(), "Komunikat", MB_OK | MB_ICONSTOP);


ale w C++Builder 2009 i 2010 musi dokonać konwersji na wchar_t:

Kod: Zaznacz cały
Application->MessageBox( ("Tekst" + Edit1->Text).w_str(), L"Komunikat", MB_OK | MB_ICONSTOP);


To dotyczy nie tylko tego komunikatu. Musisz nauczyć się konwersji z jednych typów na inne, gdyż nie jest to już tak proste jak we wcześniejszych wersjach. Musisz wiedzieć jakiego typu używasz i jakiego oczekują funkcje.

Domyślnie środowisko będzie w większości funkcji, używać typu char, ale nie zawsze. Zawsze będzie jednak używać typu UnicodeString zamiast AnsiString.
Można zmienić domyślne używanie typu char na wchar_t w opcjach projektu.
Menu: Project -> Options - sekcja: Direcotries and Conditionals
w tabelce po prawej stronie odszukaj pozycję: _CHAR i zmień char na wchar_t.

options.png
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
continue
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Cannot convert 'char *' to 'const wchar_t *'

Nowy postprzez continue » sobota, 27 lutego 2010, 10:04

Problem rozwiązany w C++ alw w D2009: Char to WideChar.
Ciężko będzie przerabiać np: 400 tys. linii kodu szukając każdego Char który powinien być 1-bajtowy.
Trudno sobie wyobrazić gorszą formę wprowadzenia Unicode'a.
I nie ma na to opcji kompilatora, wiec jak nie potrzebujesz unicode to chyba nie warto przechodzić na 2009, dlaczego nie zostawili starego kompilatora, żeby każdy kompilował sobie z Unicode lub bez niego? Każdy miałby najlepsze i najnowocześniejsze środowisko programistyczne a równocześnie kompilator tej wersji języka, która mu odpowiada.
Obrazek Obrazek ObrazekObrazek
Avatar użytkownika
continue
Bladawiec
Bladawiec
 
Posty: 11
Dołączył(a): piątek, 12 lutego 2010, 09:20
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Windows XP Pro SP2
Kompilator: C++ Builder Rad sudio 2009
Delphi 2009
Gadu Gadu: 0
    Windows XPInternet Explorer 6

Re: Cannot convert 'char *' to 'const wchar_t *'

Nowy postprzez Cyfrowy Baron » sobota, 27 lutego 2010, 11:06

Wciąż możesz używać typu AnsiString i char. Co do char to podałem jak zmienić ustawienia kompilatora, choć nie dla wszystkich funkcji to zadziała. Co do AnsiString to musisz deklarować zmienne typu AnsiString, czyli:

Kod: Zaznacz cały
AnsiString tekst = "jakiś tekst";


Jeżeli będziesz deklarował String:

Kod: Zaznacz cały
String tekst = "jakiś tekst";


To kompilator zawsze potraktuje typ String jako UnicodeString, czyli inaczej niż we wcześniejszych wersjach.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Google [Bot] i 6 gości