Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   PDWORD[0] in Delphi (von C(++?)) (https://www.delphipraxis.net/169876-pdword%5B0%5D-delphi-von-c.html)

Alter Mann 17. Aug 2012 19:03

PDWORD[0] in Delphi (von C(++?))
 
Hallo,

wie setze folgenden C-Code um?
Code:
...
DWORD *pFirstSectOfFat;
...
    // First FAT Sector
    pFirstSectOfFat[0] = 0x0ffffff8; // Reserved cluster 1 media id in low byte
    pFirstSectOfFat[1] = 0x0fffffff; // Reserved cluster 2 EOC
    pFirstSectOfFat[2] = 0x0fffffff; // end of cluster chain for root dir
...
bei
Delphi-Quellcode:
...
var
   pFirstSecFAT   : PDWORD;
...
        pFirstSecFAT^[0]           := $0ffffff8;
        pFirstSecFAT^[1]           := $0fffffff;
        pFirstSecFAT^[2]           := $0fffffff;
...
mault der Compiler und sagt Array-Typ erforderlich.

Danke für die Mühe:?

daywalker9 17. Aug 2012 19:15

AW: PDWORD[0] in Delphi (von C(++?))
 
Die Exakte Übersetzung wäre wohl dieses hier:

Delphi-Quellcode:
var
   pFirstSecFAT : PDWORD;
begin
  {$POINTERMATH ON}
  new(pFirstSecFAT);
  pFirstSecFAT[0] := $0ffffff8;
  pFirstSecFAT[1] := $0fffffff;
  pFirstSecFAT[2] := $0fffffff;
  {$POINTERMATH OFF}

Namenloser 17. Aug 2012 19:34

AW: PDWORD[0] in Delphi (von C(++?))
 
In älteren Versionen, wo es kein Pointermath gibt, so:
Delphi-Quellcode:
type
  PDWORDArray = ^TDWORDArray;
  TDWORDArray = array [0..0] of DWORD;
var
   pFirstSecFAT : PDWORDArray;
begin
  new(pFirstSecFAT);
  pFirstSecFAT[0] := $0ffffff8;
  pFirstSecFAT[1] := $0fffffff;
  pFirstSecFAT[2] := $0fffffff;
Was mir etwas seltsam vorkommt, ist dass nur für das erste Element Speicher reserviert wird, wenn ich das richtig sehe.

Panthrax 17. Aug 2012 19:49

AW: PDWORD[0] in Delphi (von C(++?))
 
System.SysUtils.pas(165):
Delphi-Quellcode:
{ General arrays }

  PByteArray = ^TByteArray;
  TByteArray = array[0..32767] of Byte;

  PWordArray = ^TWordArray;
  TWordArray = array[0..16383] of Word;
In Anlehnung daran würde ich das Feld mit den Grenzen 0..8191 deklarieren:
Delphi-Quellcode:
type
  PDWordArray = ^TDWordArray;
  TDWordArray = array [0..8191] of DWord;

himitsu 17. Aug 2012 21:17

AW: PDWORD[0] in Delphi (von C(++?))
 
Delphi-Quellcode:
array[0..0] of
ist in Delphi ein Sonderfall.
Das entspricht einem "offenen" statischem Array und für die Indizierung wird niemals ein Bereichsprüfungscode implementiert, selbst wenn in den Projectoptionen/Compilerschaltern die entsprechende Funktion aktiviert sein sollte.


[edit]
Delphi-Quellcode:
array[0..0] of
nutzen viele Delphianer als Sonderfall, für ein offenes Array (nur bei Pointern).

Es entspricht also quasi eigentlich einem
Delphi-Quellcode:
[0..unbegrenzt]
.

Panthrax 18. Aug 2012 01:16

AW: PDWORD[0] in Delphi (von C(++?))
 
Ich habe versucht eine Quelle zu finden. Wo steht, dass das ein Sonderfall ist, und dass für Felder mit den Grenzen 0..0 nie eine Bereichsprüfung durchgeführt wird?

himitsu 18. Aug 2012 01:51

AW: PDWORD[0] in Delphi (von C(++?))
 
Mir isses so, als stand malvor vielen Jahren irgendwo in der OH :gruebel: oder doch nur in irgendeinem Tutorial?

Nja, zumindestens ist es eine sehr einfache Deklaration,

denn die andere Variante ist nicht wirklich schön.
Delphi-Quellcode:
type
  TMyArray = array[0..(High(NativeInt) - SizeOf(NativeUInt) * 2) div SizeOf(TIrgendwas) - 1] of TIrgendwas;
  PMyArray = ^TMyArray;

  TMyArray2 = array[0..IrgendeinWertWoManDenktErKönntePassenUndDerNichtZuGroßIst{bei 32 Bit unter 2 GB, inkl Verwaltungsdaten}] of TIrgendwas;
  PMyArray2 = ^TMyArray2;

Alter Mann 18. Aug 2012 09:39

AW: PDWORD[0] in Delphi (von C(++?))
 
Danke Leute,

das
Delphi-Quellcode:
{$POINTERMATH ON}
hat geholfen. Nun muss nur noch der Rest hinhauen:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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