String hat Probleme mit Array :-O ?



  • Hallo,
    wieso geht da snicht ?

    string sParameter1=argv[1];
    

    Error 2 error C2440: 'initializing' : cannot convert from 'TCHAR *' to 'std::basic_string<_Elem,_Traits,_Ax>'

    und wenn ich es _T(argv[1]);
    gehts auch nicht

    k0m!$ch 0d3r?



  • Wieso deklarierst du main() nicht wie folgt?

    int main(int argc, char** argv)
    {
       // ...
    }
    


  • 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 ist



  • Scheint, als nutzt Du eine Microsoft-eigene Version der main-Funktion, die einen Parameter argv vom Typ TCHAR*argv[] statt char*argv[] erwartet. Guckst Du in der Compiler Dokumentation nach, was TCHAR sein soll. Ich kenne TCHAR nicht.



  • 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 ist

    dann 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


  • Mod

    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ß,
    SP

    Das 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ß,
    SP

    Das 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


Anmelden zum Antworten