Uruz Geschrieben 4. Februar 2002 Geschrieben 4. Februar 2002 Huhu... da bin ich wieder mal... also... ich habe folgendes Problem: Ich lege in meine Hauptprogramm Speicherbereich fuer eine beliebige Struktur an und uebergebe den Pointer darauf an eine Funktion in einer anderen Klasse... der Pointer ist als untypisiert definiert... kann ich in der aufgerufenen Funktion die Groesse des Speicherbereiches bestimmen, die der Pointer referenziert ? Die Funktion bekommt zwar die Groesse mit SizeOf(Buffer^) uebergeben, aber ich will auf Nummer sicher gehen und innerhalb der Funktion nochmal pruefen, ob Size mit der tatsaechlichen Groesse uebereinstimmt... schon mal vielen dank fuer die Hilfe Uruz Zitieren
MarcG Geschrieben 6. Februar 2002 Geschrieben 6. Februar 2002 AFAIK solltest du einen untypisierten Pointer vor der Benutzung immer erst Casten, also wenn dein Pointer auf eine Structur vom Typ TMyStructure verweist sollte die Größe so Bestimmt werden : SizeOf(TMyStructure(Buffer)) Zu verifizierung der Größe in der funktion kannst du es machen wie es in der WinAPI oft gemacht wird ungefähr so ... Function Test(Buffer : TPointer; Size : Integer) : TIrgendwas; und aufrufen wüdest du das so x := Test(MyBuffer, SizeOf(TMyStructure(MyBuffer)); dann musst du nur überprüfen ob SizeOf(TMyStructure(Buffer)) = Size ist. Das ist jetzt alles aus dem Kopf geschrieben und ich gebe keine 100%ige Funktionsgarantie auf irgendwelchen code Zitieren
MarcG Geschrieben 6. Februar 2002 Geschrieben 6. Februar 2002 Ach ja, in der winAPI werden so häufig Strings bzw deren Länge übergeben. Zitieren
Uruz Geschrieben 6. Februar 2002 Autor Geschrieben 6. Februar 2002 huhu marc... also... es geht um folgende sache... ich habe eine Komponente, die einen zwei-dimensionalen Array aus Objekten beinhaltet. Diese Objekte habe eine Eigenschaft BarData... darin wurde bislang ein integer gespeichert, ich habe die Komponente abgeleitet und speichere jetzt darin einen Zeiger auf eine Struktur, die einerseits einen Zeiger auf eine beliebige Struktur und andererseits die Groesse der beliebigen Struktur beinhaltet. Wenn ich nun auf BarData zugreife, mache ich das aus dem Hauptprogramm mit einer Komponentenfunktion Kompo.GetAllData(X,Y : LongInt; Buffer : Pointer; Size : LongInt) Da ich ja den Speicher fuer Buffer im Programm allokieren muss, muss ich quasi die Groesse der Struktur schon vorherh auslesen und dafuer hab ich auch eine Funktion geschrieben... Kompo.GetSizeOfStruct(X,Y : LongInt; var Size : LongInt) wenn ich jetzt die Aufrufe so gestalte: Kompo.GetSizeOfStruct(1,1, Size); GetMem(Buffer,Size); Kompo.GetAllData(1,1, Buffer, Size); dürfte das theoretisch kein Problem darstellen... aber um sicher zu gehen, wollte ich in der Funktion GetAllData innerhalb der Komponente noch austesten... ob SizeOf(Buffer^) = Size bzw. SizeOf(Buffer^) = BarData^.Size ist. So wie ich es geschrieben habe, geht es nicht... und ich wuesste auch nicht wie sonst... es wuerde naemlich Schwierigkeiten in dem Falle geben, dass ich unterschiedlich große Strukturen zugewiesen habe und einen falschen Aufruf mache z.B.: Kompo.GetSizeOfStruct(1,1, Size); GetMem(Buffer,Size); Kompo.GetAllData(1,2, Buffer, Size); oder: Size := SizeOf(TTestStruct1)) GetMem(Buffer,Size); Kompo.GetAllData(1,1, Buffer, SizeOf(TTestStruct2))); hoffe, du verstehst, was ich meine... Uruz Zitieren
MarcG Geschrieben 11. Februar 2002 Geschrieben 11. Februar 2002 >Size := SizeOf(TTestStruct1)) >GetMem(Buffer,Size); >Kompo.GetAllData(1,1, Buffer, SizeOf(TTestStruct2))); Ich würde den SizeOf nicht so schreiben, du solltest den Struct Casten (umwandel) ungefähr so: var MyStruct : TTestStruct1; . . . size := SizeOf(TTestStruct1(MyStruct)); Aber kann es sein, dass du von C/C++ kommst ? In Delphi ist das ganze mit Pointern viel einfacher als in C. du benutzt in Delphi viel öfter Pointer als du denkst. MyStruct ist im obigen Beispiel schon sowas wie ein Pointer, und den kannst du ganz ohne ^ ansprechen, also MyStruct.Size anstelle von MyStruct^.Size. Probiers mal ohne die ganzen ^ Dächer. var pButton : ^TButton; kannst du ganz einfach mit pButton.color und nicht mit pButton^.color ansprechen (keine Pointer auf Pointer etc. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.