Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

11

22.11.2007, 19:32

Die Klassen haben garkeinen Konstruktor, das hat die in der Tribase aber auch nicht. Könnte es noch andere Ursachen für das überschreiben der vtable geben? (Das Objekt wird von anderer Seite mit Zeromemory überschrieben)

Nico

Frischling

Beiträge: 82

Wohnort: Nürnberg

  • Private Nachricht senden

12

22.11.2007, 20:01

Zitat von »"jojendersie"«

Die Klassen haben garkeinen Konstruktor, das hat die in der Tribase aber auch nicht.


Großer Fehler.
1.)
http://cpp.codenewbie.com/articles/cpp/1504/The_Rule_Of_Three-Page_1.html

2.)http://www.fredosaurus.com/notes-cpp/oop-condestructors/constructors.html

Zitat


If no constructor is defined, C++ invokes a default constructor, which allocates memory for the object, but doesn't initialize it.

lg

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

13

22.11.2007, 21:22

Zitat von »"jojendersie"«

C-/C++-Quelltext

1
2
3
4
5
6
7
    case OR_GUI_BUTTON:
        pObject = (OrGUI*)(OrMemAlloc(sizeof(OrGUIButton)));
        break;
    case OR_GUI_TEXTFIELD:
        pObject = (OrGUI*)(OrMemAlloc(sizeof(OrGUITextField)));
        break;
// ...

Ersetzen durch:

C-/C++-Quelltext

1
2
3
4
5
6
7
    case OR_GUI_BUTTON:
        pObject = new OrGUIButton;
        break;
    case OR_GUI_TEXTFIELD:
        pObject = new OrGUITextField;
        break;
// ...

Die anderen natürlich auch.
Nur so kann die Funktionszeigertabelle (bzw. der Zeiger auf sie) korrekt gesetzt werden.
ZeroMemory wegmachen. Das zerstört die Funktionszeigertabelle (bzw. den Zeiger auf sie).

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

22.11.2007, 23:08

Zitat von »"jojendersie"«

Ich will hier nicht für doof verkauft werden, aber ich sagte das Objekt ist korrekt, das ergeben debug und andere tests, außerdem erzeuge ich noch an hunderten anderen Stetllen Objekte die auch alle richtig funktionieren. Außerdem funktioniert je auch bei diesem Objekt alles, wenn ich in der Basisklasse das Schlüsselwort virtual wegnehme. Mein Problem ist, dass das nicht funktionirt wenn es virtuel ist!!!


Warum regst du dich eigentlich so auf? Keiner will dich für doof verkaufen. Was ich gesagt habe war eine Vermutung wo der Fehler zu finden sein könnte. Und ich bin mir ziemlich sicher, nachdem was ich jetzt gelesen habe, das der Fehler genau an dieser Stelle liegt.
@D13_Dreinig

jojendersie

Frischling

  • »jojendersie« ist der Autor dieses Themas

Beiträge: 47

Wohnort: Berlin

  • Private Nachricht senden

15

23.11.2007, 22:54

Zitat

Warum regst du dich eigentlich so auf?...

Entschuldigung, aber ich habe mehrere Tage herumgetstet und konnte daher eingrenzen, dass ein Objekt mit sicherheit existiert und andere Methoden funktionierten und Daten ändern konnten. Nach mehreren Posts die Antwort zu bekommen: "sieht so aus als würde kein korrektes Objekt erzeugt werden (soll in dem Fall heißen der vptr ist nicht korrekt initialisiert)", was ich ja außschließen konnte, fand ich nicht sonderlich erfreulich.
(Das es existiert, stand bereits in meinem ersten Post.)


So und nun zum erfreulichen Teil, die vtable wurde wirklich überschrieben, das Problem ist also gelößt.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

24.11.2007, 00:33

Zitat von »"jojendersie"«


die vtable wurde wirklich überschrieben, das Problem ist also gelößt.


Siehe da... :roll:
@D13_Dreinig

Werbeanzeige