seltsames strtok_s problem



  • VirtualDreams schrieb:

    Hmm, aber es werden doch alle variablen neu angelegt beim funktionsaufruf, also müßte es rein theoretisch auch wieder so funktionieren. Zumal kann strToken gar nicht modifiziert werden da er wegen glGetString() const ist ??? oder täusch ich mich da?

    Ja, da täuschst du dich vermutlich - durch deinen Cast hast du die const-ness von strToken explizit aufgehoben (und weil dein Compiler dir vertraut, beschwert er sich auch nicht darüber). Und ob die Variablen wirklich neu angelegt werden, bin ich mir nicht sicher - womöglich liefert glGetString() nur einen Zeiger auf deinen String und dann arbeitet jeder Aufruf auf dem selben Datenbereich.

    (aber wie das läuft, könntest du dir mal im Debugger ansehen)



  • Du hast recht, im Debugger wird der ext_string so kaputt gemacht das nur noch die erste extension drinsteht. Wird die Funktion erneut aufgerufen schreibt er lediglich nur noch die erste ext. rein. Scheint also wirklich auf dem selben speicher zu laufen.

    Wie kann man nun das problem beheben. glGetString liefert in jedem Fall einen konstanten string zurück.



  • Wie wärs mit Anlegen einer nicht-konstanten Kopie? 🤡



  • Hat ich auch schon mal vor, aber wieder verworfen ^^ Werd wohl aber nicht drumrum kommen ^^



  • VirtualDreams schrieb:

    Wie kann man nun das problem beheben. glGetString liefert in jedem Fall einen konstanten string zurück.

    Und da siehst du, warum Cast's so gefährlich sind - durch das '**(char*)**glGetString(...)' sagst du dem Compiler, daß du die Rückgabe als nicht-konstanten String verwenden willst. Also beschwert er sich nicht mehr, daß er eigentlich nicht darauf schreiben dürfte.

    (und je nachdem, wohin der zurückgegebene Zeiger verweist, bekommst du entweder eine Access Violation zur Laufzeit oder - wie in deinem Fall - schreibst munter in Bereiche, die von der Programmlogik nicht beschrieben werden sollten)

    Als Lösung könntest du entweder eine lokale Kopie des Strings anlegen oder du verwendest andere str..() Funktionen, um den Extension-String zu zerteilen. (oder gleich std::string)



  • hab es jetzt mit

    char *token;
    	char *ext_string = new char[strlen((char*)glGetString(GL_EXTENSIONS)) + 1];
    	strcpy(ext_string, (char*)glGetString(GL_EXTENSIONS));
    	char *next_token;
    
    	token = strtok_s(ext_string, " ", &next_token);
    
    [...]
    
    if(ext_string != NULL)
    		delete[] ext_string;
    

    gelöst und funktioniert wunderbar =))



  • Und jetzt noch die beiden Casts ((char*)glGetString) rausgenommen, dann wird es richtig gut 😉



  • Das geht leider nicht da der compiler wegen GLubyte und char meckert ^^ Kann es nicht konvertieren.



  • Dann caste wenigstens nach const char* und nimm nen C++-Cast 😉



  • OK =)) Zu Befehl ^^


Anmelden zum Antworten