String hat Probleme mit Array :-O ?
-
be3pw0rldent!ickl3r schrieb:
Nexus schrieb:
Wieso deklarierst du
main()
nicht wie folgt?int main(int argc, char** argv) { // ... }
meinst du das ändern von tchar auf char?
ich müssten den restlichen code denn auch ändern, der auf unicode ausgelegt istdann typedeffe dir dich einen std::basic_string mit den richtigen Templateparametern als tstring - wenns das nciht schon längst gibt.
Allerdings ist meines Wissens nur die char-variante von main() standardkonform.
-
Also wenn TCHAR Unicode ist, dann doch wohl:
std::wstring parm1 = argv[1];
Stefan.
-
Vielleicht kann ein MSVC Nutzer mir ja mal erklären, was der Unterschied zwischen TCHAR und wchar_t ist, und ob man jetzt basic_string<TCHAR> braucht, oder ob man einfach wstring nehmen kann. Bin ja nur ein dummer G++ Nutzer. :p
Und was soll eigentlich dieses _T() immer? Ist das dazu da, um Stringliterale im richtigen Typ (TCHAR) zu erzeugen?
Edit: Hat sich erledigt. Man kann das hier nachlesen.
Sieht also so aus, als ob Beepworldentwickler sein Programm im "unicode"-Modus compiliert, wobei _TCHAR dann durch wchar_t ersetzt wird. Ich weiß nicht, ob CString hier wirklich das gelbe vom Ei ist (ich kenne Microsoft's CString nicht wirklich), oder ob man nicht doch einfach sich nen typedef a la
typedef std::basic_string<_TCHAR> tstring;
bauen sollte.
Gruß,
SP
-
Sebastian Pizer schrieb:
Vielleicht kann ein MSVC Nutzer mir ja mal erklären, was der Unterschied zwischen TCHAR und wchar_t ist, und ob man jetzt basic_string<TCHAR> braucht, oder ob man einfach wstring nehmen kann. Bin ja nur ein dummer G++ Nutzer. :p
Und was soll eigentlich dieses _T() immer? Ist das dazu da, um Stringliterale im richtigen Typ (TCHAR) zu erzeugen?
TCHAR ist ein #define/typedef (bin nicht sicher) entweder auf char oder auf wchar_t in abhängigkeit der davon, ob das Programm mit Unicodeunterstützung arbeiten soll, oder nicht. Das Makro _T erstellt dann die entsprechenden Literale nach bedarf als narrow- oder wide-character-Literale, also ungefähr so
#ifdef UNICODE #define _T( x ) L##x #else #define _T( x ) x #endif
keine besondere Magie also.
-
Sebastian Pizer schrieb:
Ich weiß nicht, ob CString hier wirklich das gelbe vom Ei ist (ich kenne Microsoft's CString nicht wirklich), oder ob man nicht doch einfach sich nen typedef a la
typedef std::basic_string<_TCHAR> tstring;
bauen sollte.
Gruß,
SPDas ist nicht nötig, std::wstring klappt prima. Jedenfalls bei mir.
Stefan.
-
DStefan schrieb:
Das ist nicht nötig, std::wstring klappt prima. Jedenfalls bei mir.
Auch mit ausgeschalteter unicode-Unterstützung? Ich hab noch nicht versucht, einen char* (= TCHAR* ohne unicode) einem wstring zu verpassen, würde mich aber wundern wenns ohne weiteres geht.
-
DStefan schrieb:
Sebastian Pizer schrieb:
typedef std::basic_string<_TCHAR> tstring;
Das ist nicht nötig, std::wstring klappt prima. Jedenfalls bei mir.
Im Unicode-Modus, ja. Sonst nicht. :p
Was ich auch gerade nachgeguckt hatte: Java und Microsoft Windows sind von UCS-2 auf UTF-16 umgestiegen.
Gruß,
SP
-
pumuckl schrieb:
Allerdings ist meines Wissens nur die char-variante von main() standardkonform.
3.6.1 Main function schrieb:
[...]
It shall have a return type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following definitions of main:
int main() { /* ... */ }
and
int main(int argc, char *argv[]) { /* ... */ }Hatte zwar gerad nur den Working Draft von '05 zur Hand, aber sollte schon immer so gewesen sein^^
Also ist es nur ohne UNICODE-Unterstützung standard-konform...
bb
-
unskilled @logged-off schrieb:
Also ist es nur ohne UNICODE-Unterstützung standard-konform...
Nein, standardkonform sind nach deinem Zitat auch alle weiteren Argumente, solange es die main() und main(int, char**)-Version prallel dazu gibt. Der Windows-Compiler darf also durchaus auch main(int, wchar_t**) zulassen. Nur portabel ist das dann nicht mehr.
-
Sebastian Pizer schrieb:
DStefan schrieb:
Sebastian Pizer schrieb:
typedef std::basic_string<_TCHAR> tstring;
Das ist nicht nötig, std::wstring klappt prima. Jedenfalls bei mir.
Im Unicode-Modus, ja. Sonst nicht. :p
Verflixt! Daran hatte ich nicht gedacht. Wer lesen kann, ist klar im Vorteil
Sebastian Pizer schrieb:
Was ich auch gerade nachgeguckt hatte: Java und Microsoft Windows sind von UCS-2 auf UTF-16 umgestiegen.
Darüber hatte ich mir überhaupt noch keine Gedanken gemacht
Bedeutet das, dass man die einzelnen Zeichen in einem "Microsoftschen" String nicht mehr einfach per Index-Zugriff bearbeiten kann?int main() { std::wstring str = getMeSomeUTF16String(); for(size_t i = 0; i < str.length(); ++i) std::wcout << str[i] << std::endl; }
... mal angenommen, die Console stellt die Zeichen korrekt dar ...
Stefan.
-
DStefan schrieb:
Sebastian Pizer schrieb:
Ich weiß nicht, ob CString hier wirklich das gelbe vom Ei ist (ich kenne Microsoft's CString nicht wirklich), oder ob man nicht doch einfach sich nen typedef a la
typedef std::basic_string<_TCHAR> tstring;
bauen sollte.
Gruß,
SPDas ist nicht nötig, std::wstring klappt prima. Jedenfalls bei mir.
Stefan.
Bei mir leider nicht.
Also wenn ich folgendes benutze:
string::size_type sHallosuchen = strtok2.find( "hallo", 0);
oder
wstring::size_type sHallosuchen = strtok2.find( "hallo", 0);
hab ich auch schon probiert aber es kommt im die Fehlermeldung:Error 2 error C2039: 'find' : is not a member of 'ATL::CStringT<BaseType,StringTraits>'
-
CString ist auch etwas anderes als std::string oder std::wstring. CString ist Microsoft-spezifisch -- eine eigene nicht-Standard Klasse, die, so wie ich das verstanden habe, intern auf _TCHAR setzt, wobei _TCHAR ja je nach Überstzungs-Modus char oder wchar_t ist. Siehe MSDN.
Gruß,
SP
-
So ist es. Zusätzlich gibt es noch mehrere Varianten von CString.
Eine MFC Implementation und eine ATL Implementation, die subtil anders sind.Simon