AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array[0..0] Speicherreservieren

Ein Thema von Alter Mann · begonnen am 7. Sep 2010 · letzter Beitrag vom 7. Sep 2010
Antwort Antwort
Seite 1 von 2  1 2      
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:33
Delphi-Version: 2009
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:
...
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;
Ich kann die Struktur des Record nicht ändern. Gibt es noch eine andere Möglichkeit?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:37
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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General ( 7. Sep 2010 um 10:40 Uhr)
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:44
Hallo,

die Idee mit GetMem ist nicht schlecht, nur, ich kann den Record nicht ändern!
"Fehlermeldung: Inkompatible Typen"
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:46
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:50
Da der Compiler ja den Typ PI kennen sollte, sollte

SetLength(D.PE, 15); reichen
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:54
Da der Compiler ja den Typ PI kennen sollte, sollte

SetLength(D.PE, 15); reichen
PE ist aber kein dynamisches Array. Das wird also mit SetLength nicht funktionieren.
Ich bin immernoch der Meinung, dass es nicht geht.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:55
Zitat:
ich nicht gerade aufm Schlauch stehe
Das wollen wir doch mal nicht hoffen

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:
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);
Wie geschrieben es geht hier nicht um IOCTL_DISK_GET_DRIVE_LAYOUT sondern um die Speicherreservierung.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:57
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:
type PDLI = ^DLI;

var X: PDLI;

X := GetMemory(SizeOf(DLI) + (PE_Count - 1) * SizeOf(PI));
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.

[edit]
oder so
$2B or not $2B

Geändert von himitsu ( 7. Sep 2010 um 11:02 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 10:58
So:

Delphi-Quellcode:
var D: ^DLI;
begin
  GetMem(D,SizeOf(DLI) + 15*SizeOf(PI));
end;
@himitsu (über mir): GetMem ist eine Procedure mit 2 Parametern. Du meinst wahrscheinlich GetMemory
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Array[0..0] Speicherreservieren

  Alt 7. Sep 2010, 11:02
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?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:20 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz