wchat_t array initialisiert größer als es sollte



  • Hallo,

    habe folgendes Problem:

    wchar_t * text1 = new wchar_t[lineBreakPoint];
    

    lineBreakPoint hat den Wert 23(in einem konkreten Fall). Die Länge des Arrays, also der Wert von wcslen(text1) beträgt aber 31.

    Jetzt ist das Array größer, als ich es haben will. Problematisch ist es, wenn ich über dieses Array iteriere von Anfang bis Ende - denn dann sind die letzten Zeichen eben irgendwas, weil ich ja nur die ersten 23 Zeichen befülle.

    Auch komisch ist, wenn ich z.B zum LinkBreakPoint 11 dazu addiere, wird das Array nur um 8 größer...
    Wie kann ich die größe dieses Arrays gezielt steuern?


  • Mod

    Ähh, kann es sein, dass du so etwas wie vector<wchar_t> oder wstring suchst?

    Außerdem ist wcslen sicherlich die falsche Funktion, um die Länge von dem Objekt festzustellen, dass du hier erstellt hast.



  • Also Datentyp such ich keinen anderen. vector is sicher komfortabler, aber ich arbeite mit vordefinierten Methoden weiter, und die brauchen einen wchar_t Array als Parameter.

    Dass wcslen die falsche Methode ist, kann sein. Die sollte die Anzahl der chars (in meinem Fall wchar_t) in einem String zurückgeben. Dachte man kann ein wchar_t array als String sehen.

    Aber wie ermittle ich dann die größe des arrays? Mit Größe meine ich jetzt die maximalen Anzahl der Elemente des Arrays, nicht den Speicherplatz.


  • Mod

    stb01 schrieb:

    Also Datentyp such ich keinen anderen. vector is sicher komfortabler, aber ich arbeite mit vordefinierten Methoden weiter, und die brauchen einen wchar_t Array als Parameter.

    Also einen vector<wchar_t> oder einen wstring. 🙄

    Dass wcslen die falsche Methode ist, kann sein. Die sollte die Anzahl der chars (in meinem Fall wchar_t) in einem String zurückgeben. Dachte man kann ein wchar_t array als String sehen.

    Ja, kann man. Aber die Länge eines Arrays ist nicht die Länge eines Strings. Das ist wie der Unterschied zwischen einem C-String und einem char-Array. Das gilt ganz besonders bei wchars.

    Aber wie ermittle ich dann die größe des arrays?

    Indem du sie dir merkst oder einen vector<wchar_t> oder wstring benutzt, die das schon für dich machen.

    Mit Größe meine ich jetzt die maximalen Anzahl der Elemente des Arrays, nicht den Speicherplatz.

    😕 Was soll der Unterschied sein.

    Kann's sein, dass dir die Grundlagen zu C-Strings fehlen?



  • Kann's sein, dass dir die Grundlagen zu C-Strings fehlen?

    Kann sein, bin kein Fan von C und habs nie gelernt... In Java gibts solche probleme nicht, drum hunzt es mich hier gewaltig.

    😕 Was soll der Unterschied sein.

    Naja, bin wie gesagt kein Profi in c, aber die Speicherplatz ist nicht nur abhängig von der Anzahl der Elemente, sondern auch vom Datentyp der Elemente. So brauchen ein wchar_t Array und ein normales char Array mit gleich vielen Elementen unterschiedlich viel Speicherplatz, oder?

    -----

    Nichts desto trotz versuch ich mal, das ganze auf vector umzubaun. Weil nur weil ich die größe des Arrays mir merke, wirds trotzdem nicht kleiner, und den Methoden weitergeben muss ich das komplette Array.
    Erster Versuch ist schonmal gescheitert, vector<wchar_t> scheint aber zumindest mal nicht kompatibel zu sein mit nem wchar_t array, also genau wie ich das befürchtet hab wenn ich nen anderen Datentyp nehme.
    "Convertierung in LPCWSTR nicht möglich"

    War aber nur jetzt mal auf die schnelle, arbeite jetzt mal weiter dran



  • stb01 schrieb:

    Hallo,

    habe folgendes Problem:

    wchar_t * text1 = new wchar_t[lineBreakPoint];
    

    lineBreakPoint hat den Wert 23(in einem konkreten Fall). Die Länge des Arrays, also der Wert von wcslen(text1) beträgt aber 31.

    Jetzt ist das Array größer, als ich es haben will. Problematisch ist es, wenn ich über dieses Array iteriere von Anfang bis Ende - denn dann sind die letzten Zeichen eben irgendwas, weil ich ja nur die ersten 23 Zeichen befülle.

    Auch komisch ist, wenn ich z.B zum LinkBreakPoint 11 dazu addiere, wird das Array nur um 8 größer...
    Wie kann ich die größe dieses Arrays gezielt steuern?

    Dein Array ist offensichtlich nicht zu groß sondern zu klein. Denn das Ergebnis von wcslen muß IMMER kleiner als die Größe des Buffers sein.

    Wenn Du über eine Zeichenkette iterierst, ist das Endekriterium immer das Nulzeichen.

    <char_type> *cp = xxx; // char_type kann sein char oder wchar_t. xxx ist was auch immer Du gerade brauchst.
    
    for( size_t i=0; cp[i]; i++ )
    {
        .....
    }
    

    Alternativ kann statt dem Index auch ein zweiter Zeiger verwendet werden

    <char_type> *cp = xxx; // char_type kann sein char oder wchar_t. xxx ist was auch immer Du gerade brauchst.
    
    for( <char_type> *cp2=cp; *cp2; cp2++ )
    {
        .....
    }
    

    wie die anderen schon geschrieben haben, die tatsächliche Größe des Puffers mußt Du Dir anderweitig merken.

    mfg Martin



  • SeppJ schrieb:

    Mit Größe meine ich jetzt die maximalen Anzahl der Elemente des Arrays, nicht den Speicherplatz.

    😕 Was soll der Unterschied sein.

    Kann's sein, dass dir die Grundlagen zu C-Strings fehlen?

    Also Sepp,

    Die Anzal der Elemente ist das, was new mitgegeben wurde. Der erforderliche Speicherplatz ist Anzahl * sizeof( ein Element )

    mfg Martin



  • Solang du keinen Nulldelimiter in dein allokiertes Array schreibst, wird wcslen dir irgendwelchen Murks zurückgeben - wenn du Pech hast auch mal ne ziemlich große Zahl. Warum? Na, wie strlen such wcslen einfach nach dem nächsten Nulldelimiter - und den findet es halt erst irgendwo im Nirvana hinter deinem Array. Wenn du Glück hast, dann tut das Programm nichts seltsames an der Stelle sondern stürzt einfach mit einer Access-Violation ab.

    Dass das in Java "anders" ist ist klar, schließlich ist Java eine andere Sprache. Arrays wie in C und C++ gibts in Java einfach nicht. Was in Java "Array" heißt, ist in C++ am ehesten noch mit einem vector verwandt. Vermutlich willst du den auch benutzen. Oder solltest es wollen.

    Was du an der Stelle auf jeden Fall verinnerlichen solltest: Versuch garnicht erst, Dinge die du von Java her kennst, auf C++ zu übertragen. Das geht meistens schief, oft sogar ganz gehörig.



  • stb01 schrieb:

    "Convertierung in LPCWSTR nicht möglich"

    Dazu folgendes: LPCWSTR ist ein "wchar_t const *".
    Den bekommst du aus einem std::vector<wchar_t> so:

    std::vector<wchar_t> vec;
    wchar_t const * ptr = &(vec[0]);
    

    und für std::wstring:

    std::wstring str;
    wchar_t const * ptr = str.c_str();
    // theoretisch klappt beim String aber auch die Variante &(str[0]);
    


  • DrakoXP schrieb:

    und für std::wstring:

    std::wstring str;
    wchar_t const * ptr = str.c_str();
    // theoretisch klappt beim String aber auch die Variante &(str[0]);
    

    Nö, nur c_str garantiert Nullterminierung.


Anmelden zum Antworten