Komisches Verhalten von char Pointern

  • C/C++

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Komisches Verhalten von char Pointern

    Guten Tag, Leute,
    Ich bin es mal wieder, mit meinen dummen C++ Fragen. Hoffentlich ist's die letzte.
    Und zwar hat jeder Knochen bei meinem Animations-System einen Namen, den ich über die DLL setze (Quellcode hier).
    Das klappt ja soweit wunderbar. Jedoch, wenn ich den Namen eines Knochen auslesen will, dann bekomme ich nicht die Strings zurück, die ich haben will. Siehe Bild unten.
    [hide=Namen][/hide]
    Da sollte jetzt irgendwie body,hip, etc. stehen.

    Ich kann mir den Fehler nicht erklären, denn wenn ich den Namen setzen und mittels MessageBox(NULL,bones.find((unsigned int)bone_index)->second->name,"bla",MB_OK); in bone_set_name ausgebe, dann bekomme ich den ganz normalen Namen, der in meinem Skeleton-File steht. Und, wenn ich per GML unmittelbar, nachdem ich den Namen gesetzt habe, den Namen, per show_message, anzeigen lasse, dann bekomme ich auch den ganz normalen Namen.
    Der Fehler tritt auf, wenn ich alle meine Daten geladen habe, und den Namen eines Knochen auslesen will.
    Woran kann das liegen? Muss ich char* name auf eine andere Weise setzen?
    Hoffentlich weiß jemand von euch was der Fehler ist.


    MfG Trixt0r

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.
  • dasselbe problem trat bei mir in C auf als ich einen String drawen wollte, der veränderbar ist, ich habe letztendlich es so gelöst, indem ich mit 2 Chars arbeite:

    GML-Quellcode

    1. //C//
    2. char cName1[laenge_des_char];
    3. char* cName2[laenge_des_char];
    4. /*nun gibst du cName1 einen Wert*/
    5. cName2=cName1; /*und voilá, nun zeigt es den richtigen Namen an*/
    6. /*du benutzt einfach cName2 um das ganze zu sprintf'en oder sonstwas*/


    ich hoffe, das hast du gemeint?
  • Ich tippe darauf, dass der Pointer nur auf eine lokale Variable zeigt, die nach Funktionsende ungültig wird. D.h. sobald du den String, den du aus der DLL hast anzeigen willst, ist er schon wieder ungültig.
    Beispiel:

    Quellcode

    1. std::string foo = "Hello";
    2. return foo.c_str();


    Das wird nicht funktionieren, da foo nach dem Funktionsende wieder gelöscht wird. Bei Doubles hast du das Problem nicht, da ja der Wert selber zurückgegeben wird und kein Pointer.

    © 2008 by Teamgrill Productions
  • @domis4: Die Lösung klappt soweit, aber ich will die Länge des Strings variabel halten.
    @Soul Reaver:char *name, wird bei mir im Header meiner Bone-Klasse deklariert und im Konstruktor dann per

    Quellcode

    1. name = NULL;
    initialisiert.

    Den String setze ich dann mit einem Parameter im Game Maker über

    Quellcode

    1. double bone_set_name(double bone_index, char *name){
    2. if(bone_index >= 1 && bone_index <= bone_i){
    3. bones.find((unsigned int)bone_index)->second->name = name;
    4. return 1;
    5. }
    6. else return -1;
    7. }


    Ich hab es jetzt soweit hinbekommen, dass jeder Knochen, den selben Namen hat und ich nicht irgendwelche Werte aus dem Speicher angezeigt werden.
    Soweit ich verstanden habe, liegt der Fehler darin, dass der allokierte Speicher für den char Pointer nach dem Ausführen wieder gelöscht wird.
    Wie kann ich denn verhindern, dass der Speicher wieder freigegeben wird? Mit calloc(strlen(name),sizeof(char)) funktioniert es nicht.

    Edit: @Unten Jop, bin auch drauf gekommen ^^. Danke an alle, die geholfen haben.

    Albert Einstein schrieb:

    Probleme kann man niemals mit derselben Denkweise lösen, durch die sie entstanden sind.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Trixt0r ()

  • Das funktioniert so nicht, da du in der Funktion nur den Pointer woanders hinzeigen lässt. In dem Fall auf die temporäre Parameter Variable, die vom GM übergeben wird. Du musst zuerst den Speicher der Membervariable anpassen und dann mittels strcpy zb den Inhalt kopieren. Du könntest aus deinem char *name in der Klasse allerdings auch ein std::string name machen (eine Standardklasse in C++) damit ersparst du dir das ganze Speichermanagement der char*.

    EDIT: Deine Funktion könntest du am einfachsten so umbauen, denk ich:

    Quellcode

    1. double bone_set_name(double bone_index, char *name)
    2. {
    3. if(bone_index >= 1 && bone_index <= bone_i)
    4. {
    5. delete [] bones.find((unsigned int)bone_index)->second->name;
    6. char *tmp = new char[strlen(name)];
    7. strcpy(tmp, name);
    8. bones.find((unsigned int)bone_index)->second->name = tmp;
    9. return 1;
    10. }
    11. else return -1;
    12. }
    Alles anzeigen

    © 2008 by Teamgrill Productions

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MasterXY ()