Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Delphi: Speichergroesse eines untypisierten Pointers bestimmen ?

Empfohlene Antworten

Veröffentlicht

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

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

Ach ja, in der winAPI werden so häufig Strings bzw deren Länge übergeben.

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.