![]() |
Delphi-Version: 2009
Array[0..0] Speicherreservieren
Moin, Moin,
ich habe das 'kleine' Problem, dass ich ein innerhalb eines Records ein dynamisches Array habe, welches initialisiert sein muss, bevor ich es auf eine Funktion los lasse. Doch wie mach ich das?
Delphi-Quellcode:
Ich kann die Struktur des Record nicht ändern. Gibt es noch eine andere Möglichkeit?
...
type DLI = record Count : DWORD; SIG : DWORD; PE : Array[0..0] of PI; end; ... var D : DLI; begin SetLength(D.PE, 15 * SizeOf(PI)); // Inkompatible Typen D.PE := AllocMem(15 * SizeOf(PI)); // - " - Array und Pointer (Das ist klar) @D.PE := AllocMem(15 * SizeOf(PI)); // der linken Seite kann nichts zugewiesen werden end; Danke |
AW: Array[0..0] Speicherreservieren
Hallo,
Also das Array ist schon initialisiert. (Hat die Größe von SizeOf(PI)) Bist du dir sicher, dass es nicht vllt. ein Pointer auf so ein Array[0..0] sein soll? Weil dann sähe das ganze schon wieder anders aus.
Delphi-Quellcode:
type
TPIArr = Array[0..0] of PI; PPIArr = ^TPIArr; DLI = record Count: DWORD; SIG: DWORD; PE: PPIArr; end; var D: DLI; begin GetMem(D.PE,15*SizeOf(PI)); end; |
AW: Array[0..0] Speicherreservieren
Hallo,
die Idee mit GetMem ist nicht schlecht:?, nur, ich kann den Record nicht ändern! "Fehlermeldung: Inkompatible Typen":( |
AW: Array[0..0] Speicherreservieren
Also wenn du das Rekord nicht ändern kannst und ich nicht gerade aufm Schlauch stehe, dann glaube ich nicht, dass du da irgendwas machen kannst...
PS: Ein GetMem mit einem Nicht-Pointer-Typ funktioniert natürlich nicht (Inkompatible Typen) |
AW: Array[0..0] Speicherreservieren
Da der Compiler ja den Typ PI kennen sollte, sollte
Delphi-Quellcode:
reichen
SetLength(D.PE, 15);
|
AW: Array[0..0] Speicherreservieren
Zitat:
Ich bin immernoch der Meinung, dass es nicht geht. |
AW: Array[0..0] Speicherreservieren
Zitat:
Hintergrund ist IOCTL_DISK_GET_DRIVE_LAYOUT vielleicht fällt da der Groschen? Das, das ein Thema für sich ist, ist mir klar aber es muss doch eine Alternative zu diesem C-Code geben:
Code:
Wie geschrieben es geht hier nicht um IOCTL_DISK_GET_DRIVE_LAYOUT sondern um die Speicherreservierung.
DWORD junk;
BOOL bResult; DWORD nPartitions = 16; DWORD nBufferSize = sizeof(DRIVE_LAYOUT_INFORMATION) + nPartitions * sizeof(PARTITION_INFORMATION); DRIVE_LAYOUT_INFORMATION* pDLI = (DRIVE_LAYOUT_INFORMATION*)malloc(sizeof(DRIVE_LAYOUT_INFORMATION) + nPartitions * sizeof(PARTITION_INFORMATION)); // <- wie in Delphi? bResult = DeviceIoControl(hDevice, IOCTL_DISK_GET_DRIVE_LAYOUT, NULL, 0, pDLI, nBufferSize, &junk, NULL); |
AW: Array[0..0] Speicherreservieren
Ein Array[0..0] ist ein statisches Array (ohne Bereichsprüfung) und über SetLength kann man nur dynamische Arrays behandeln.
Wenn, dann könnte man also nur den Speicher für den ganzen Record reservieren.
Delphi-Quellcode:
Ich hatte es mir allerdings einfach gemacht und it diese Records/Arrays selbstdefiniert und die Arrays mit einer maximal zu erwartenden Größe deklariert, als ich das letzte Mal mit sowas arbeitete.
type PDLI = ^DLI;
var X: PDLI; X := GetMemory(SizeOf(DLI) + (PE_Count - 1) * SizeOf(PI)); [edit] oder so :oops: |
AW: Array[0..0] Speicherreservieren
So:
Delphi-Quellcode:
@himitsu (über mir): GetMem ist eine Procedure mit 2 Parametern. Du meinst wahrscheinlich GetMemory :stupid:
var D: ^DLI;
begin GetMem(D,SizeOf(DLI) + 15*SizeOf(PI)); end; |
AW: Array[0..0] Speicherreservieren
Warum kannst du den RecordTyp nicht ändern? Wer zwingt dich beim Aufruf die nicht funktionierende Variante zu verwenden? Wer hindert dich daran das Array einfach groß genug zu definieren?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz