Zum Inhalt springen

Delphi: Speichergroesse eines untypisierten Pointers bestimmen ?


Uruz

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

>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. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...