Types in Types Inline?
Übersicht

![]() |
Der EisvogelBetreff: Types in Types Inline? |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo
Bisher bin ich immer davon ausgegangen, dass Types in Types per Pointer referenziert werden. Jedoch hab ich heute was anderes festgestellt. BlitzMax: [AUSKLAPPEN] Type T1 Bisher war es für mich immer so, dass die Felder a und b einen Pointer auf Instanzen von T2 beinhalten, somit T1 exact 8 Byte lang ist. Heutige Tests haben ergeben, dass T1 aber in wirklichkeit 16 Byte lang ist, da die beiden Instanzen von T2 als Inline Objekte in T1 eingebunden werden, so dass der Type imaginär so aussieht: BlitzMax: [AUSKLAPPEN] Type T1 Hatte ich hier nur etwas verwechselt und das ist völlig normal, oder ist da noch was anderes, was eine Rolle spielt bzw. wusstet ihr das auch schon? Leider hat mir dieses Verhalten von BlitzMax heute den Kopf explodieren lassen in Kommunikation mit der WinAPI, die ja manchmal genau das Verhalten verlangt, jedoch auch manchmal ein andere bevorzugt. So z.B.: Eine Struktur die einen weiteren Verweis auf eine RECT-Struktur beinhalten könnte man in BlitzMax folglich auch so bauen: BlitzMax: [AUSKLAPPEN] Type Structur Kann mir jemand dieses Verhalten bestätigen? Kann ich es jetzt auch irgendwie anrichten, dass die Types tatsächlich mit Pointer referenziert werden, also nicht Inline dargestellt werden, so dass T1 wirklich nur 8 Byte lang ist? MfG Der Eisvogel |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wie hast du denn die Größe gemessen? Eigentlich werden nur die Referenzen gespeichert... | ||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja ganz einfach. Ich habe eine API Funktion die mir eine Stuktur zurück gibt, die genau 8 Byte lang ist. Je 4 Bytes enthielten einen Pointer zu einer anderen Stuktur. Also das Verhalten was ich von BlitzMax erwartet hatte. Bei dem Versuch mittels BlitzMax Type auf die Stuktur zuzugreifen kamen völlig absurde Ergebnisse zustande. Somit weiß ich BlitzMax hat die Element inline abgefragt und nicht weiter referenziert. Wenn ich die Felder von T1 als Byte Ptr deklaiere und mit entsprechen Offsets darauf zugreife bekomme ich genau was ich will. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
mpmxyz |
![]() Antworten mit Zitat ![]() |
---|---|---|
Bist du bei Extern-Types?
Deren Inhalt wird nämlich meines Wissens nach direkt in der Variable gespeichert. (<-So dachte ich es zumindest. -> Edit) Ein Beispiel: BlitzMax: [AUSKLAPPEN] Extern -> Jede _RECT-Variable ist 16 Bytes groß. (Der Pointer zu diesem Speicherbereich wird über Varptr bestimmt.) Dadurch wird aus einer Kombination von mehreren dieser Types ein großer Speicherbereich. Als Lösung würde ich entsprechende Pointer nutzen. EDIT: Inzwischen bin ich schlauer: In C sind diese Types z.B. structs und dem entsprechend bilden sie dort den Speicherbereich einer Variable. BlitzMax bildet immer Referenzen, egal ob man diese im nicht-Extern-Teil oder im Extern-Teil nutzt. EDIT2: Diese structs sind eher C++-Structs/Klassen mit einem virtual-Destruktor. mfG mpmxyz |
||
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer |
- Zuletzt bearbeitet von mpmxyz am Sa, Jun 25, 2011 17:35, insgesamt 4-mal bearbeitet
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Nein, ich befinde mich nicht in Extern Types. Ich dachte jedoch, dass BlitzMax die automatisch mit Pointer referenziert und nicht direkt in den Type selbst einbettet. Ich wollte das nur bestätigt haben, da es mich gewundert hatte.
Ich habe das ganze im Moment über Wrapper Funktionen gelöst, aber irgendwas will immernoch nicht. Also derzeit arbeite ich mit einem UnhandledExceptionFilter. Dazu habe ich mir die nötigen Strukturen gewrapped u.a. diese mega CONTEXT-Struktur. Ich möchte mit dem Handler einen Hardware-Breakpoint abfangen. Das Setzen des Breakpoint klappt prima. Ohne meinen Handler, bekommt ihn BlitzMax selbst ab und bricht mit einer Fehlermeldung "EXCEPTION_SINGLE_STEP". Jetzt kommt mein Handler ins Spiel. Alles klappt prima beim Setzen. Auch die Abfrage der SINGLE_STEP-Exception funktioniert. Jetzt das Problem, der Code nach dem Breakpoint wird nicht mehr ausgeführt, wenn der Breakpoint sitzt. Also gehe ich mal davon aus, dass irgendwas im Speichermanagement schief geht. Irgendwo bei den Types muss der Hund begraben liegen. Wenn ich die auskommentiere Zeile vor "Print ..." im Handler einfüge, welche die Veränderten Daten wieder in den Speicher schreibt, wird noch nicht mal mehr Print im Handler selbst mehr ausgeführt. Der Code ist aufgrund der Großen Strukturen sehr lang: BlitzMax: [AUSKLAPPEN] SuperStrict |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
maximilian |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Eisvogel hat Folgendes geschrieben: Naja ganz einfach. Ich habe eine API Funktion die mir eine Stuktur zurück gibt, die genau 8 Byte lang ist. Je 4 Bytes enthielten einen Pointer zu einer anderen Stuktur. Also das Verhalten was ich von BlitzMax erwartet hatte. Bei dem Versuch mittels BlitzMax Type auf die Stuktur zuzugreifen kamen völlig absurde Ergebnisse zustande. Somit weiß ich BlitzMax hat die Element inline abgefragt und nicht weiter referenziert. Wenn ich die Felder von T1 als Byte Ptr deklaiere und mit entsprechen Offsets darauf zugreife bekomme ich genau was ich will.
Kannst du mir mal bitte erklären wie du überhaupt das BMax-Objekt erhalten hast? Denn die API-Funktion kann die ja gar nicht zurückgegeben haben, sondern lediglich Byte Ptrs. Und die kann man nicht zu BMax-Objekten casten. Sorry für die kurzen Posts, aber ich glaube du beschuldigst hier BMax eines Verhaltens, dass allein auf dich zurückzuführen ist. |
||
Variety is the spice of life. One day ignore people, next day annoy them. |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
BlitzMax Types sind nichts anderes als Pointer auf einen Speicherbereich. So wie jede andere Sturktur auch. Schreib einfach als Rückgabewert der API Funktion den Namen deines Types und fertig. Bestes Beispiel wieder die RECT Struktur. Ein Pointer auf einen 16 Byte langen Speicherbereich. Genau diesen Speicherbereich kannst du auch als Type nachbauen. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also ich könnte schwören, dass BMax Unter-Types nicht einbettet, sondern tatsächlich nur referenziert. Sonst ginge das hier schon mal nicht:
BlitzMax: [AUSKLAPPEN] Type TTest Und, ob BMax-Types wirklich Nichts anderes sind als Byte Ptr würde ich so auch nicht unterschreiben. Zwar zeigt Varptr eines Types auf das erste Feld im Type, aber ich glaube, da versteckt sich noch ein Header davor. Wie machst du denn aus dem Byte Ptr von der API einen BMax-Type? BlitzMax: [AUSKLAPPEN] Type T1 -> 8 Byte (aber eben, BMax wird wahrscheinlich noch zusätzliche Bytes für Headerdaten reservieren). mfG Holzchopf |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Es kann durchaus sein, das BM da noch andere Daten hat, aber der eigentlich Zeiger der sich in jeder Variable verbirgt zeigt immer auf das erste Feld.
Zu deinem ersten Code stimme ich dir zu, aber da könnte es ja irgendwie ne andere Handhabung geben, oder so. Wenn man eine API Funktion einbindet, die zB eine RECT Struktur zurückgibt machst du das so: BlitzMax: [AUSKLAPPEN] Extern "Win32" Das funktioniert prima. |
||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Der Eisvogel hat Folgendes geschrieben: BlitzMax Types sind nichts anderes als Pointer auf einen Speicherbereich. So wie jede andere Sturktur auch. Schreib einfach als Rückgabewert der API Funktion den Namen deines Types und fertig.
Das geht so nicht. BMax-Types sind nicht einfach nur Speicherbereiche, die man beliebig herumcasten kann, sondern Objekte mit Metadaten (um Polymorphie und Reflection zu erlauben), die zudem noch vom GC verwaltet werden. Du kannst also nicht einfach einen Rückgabewert der WinAPI in einen Type casten und C-ähnliches Verhalten erwarten. In deinem Fall musst du also den Rückgabewert der API-Funktion wie einen gewöhnlichen Speicherbereich mit Zeigern verwalten. Wenn das Struct keine Pointer enthält, könntest du alternativ dessen Inhalt mit MemCopy in einen Type kopieren, aber das ist auch eine eher gefährliche Lösung (man hat ja keine Garantie, in welcher Reihenfolge Typefelder im Speicher liegen). |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
Noobody hat Folgendes geschrieben: alternativ dessen Inhalt mit MemCopy in einen Type kopieren Sowas habe ich auch schon versucht. Aber immer, wenn ich den Pointer zu 'nem Type als Schreib-Adresse missbrauche, jagt's mir BMax um die Ohren. Auslesen geht Problemlos. Aber schreiben - keine Chance.
|
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
@Holzchopf: Die Speicheradresse des Types sollte man nicht nehmen, da man sonst oben erwähnte Header überschreibt. Stattdessen einfach den Zeiger auf das erste Feld nehmen: BlitzMax: [AUSKLAPPEN] Local Rect:TRect = New TRect |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
HolzchopfMeisterpacker |
![]() Antworten mit Zitat ![]() |
---|---|---|
:O Achso - und ich Referenzierte immer auf die Type-Instanz...
Na, dann ist ja Types kopieren doch auch möglich BlitzMax: [AUSKLAPPEN] Local Rect:TRect = New TRect Aber das wurde glaube ich nicht in diesem Thread gefragt... *mir müde die Augen reib* |
||
Erledige alles Schritt um Schritt - erledige alles. - Holzchopf
CC BY ♫ BinaryBorn - Yogurt ♫ (31.10.2018) Im Kopf da knackt's und knistert's sturm - 's ist kein Gedanke, nur ein Wurm |
![]() |
Der Eisvogel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Naja, bisher ist nie was schief gegangen. Der Zeiger des Types lag immer auf dem ersten Feld und die Felder waren immer perfekt angeordnet. Aber ich hab es jetzt doch über Wrapper gelöst. | ||
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB Projekte: Window-Crasher Ich liebe es mit der WinAPI zu spielen. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group