Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Case in Record (https://www.delphipraxis.net/186870-case-record.html)

Captnemo 8. Okt 2015 07:27

Case in Record
 
Hi,

ich quäl mich grad mit der Übersetzung aus MSDN für einen Record rum, und versteh nicht, wo hier der Fehler ist:
Delphi-Quellcode:
    DRIVE_LAYOUT_INFORMATION_EX = record
      PartitionStyle: DWORD;
      PartitionCount: DWORD;
      case Integer of
        0: (Mbr: DRIVE_LAYOUT_INFORMATION_MBR);
        1: (Gpt: DRIVE_LAYOUT_INFORMATION_GPT);
      partitionInfoEx: array of _PARTITION_INFORMATION_EX;   // <-- Hier meckert die IDE
    end;
Bei PartitionInfoEx meckert die IDE "Undeklarierter Bezeichner "partitionInfoEx" in Zeile xxx

Setze ich die Zeile über die Case-Anweisung, dann ist er zufrieden, aber mein Record wäre falsch.

Ich habe gelesen, dass bei Case mit Ordinalen Type in Records kein End hinkommt? End hintersetzen geht auch nicht. Aber wir soll ich's machen?

Zacherl 8. Okt 2015 07:32

AW: Case in Record
 
Wenn ich mich recht erinnere akzeptiert Delphi Unions (case in records) ausschließlich beim letzten Feld des Records.

Captnemo 8. Okt 2015 07:34

AW: Case in Record
 
Echt? Wie blöd ist das denn?

Und wie soll man dann sowas übersetzen?
Code:
typedef struct _DRIVE_LAYOUT_INFORMATION_EX

  DWORD PartitionStyle;
  DWORD PartitionCount;
  union
  {   
    DRIVE_LAYOUT_INFORMATION_MBR Mbr;  
    DRIVE_LAYOUT_INFORMATION_GPT Gpt;
  };
  PARTITION_INFORMATION_EX PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;

Klaus01 8. Okt 2015 07:36

AW: Case in Record
 
.. wenn Du den varianten Anteil in einem eigenen Record auslagerst
und diesen "neuen" RecordType dann im urprünglichen Record verwendest?
Funktioniert es dann?

Grüße
Klaus

Captnemo 8. Okt 2015 07:38

AW: Case in Record
 
Jepp, so funktioniert's ;)

Ist ja auch wirklich blöd.....steht sicher irgendwo in der Hilfe, aber da wär ich so nie drauf gekommen.

Zacherl 8. Okt 2015 07:41

AW: Case in Record
 
Genau, das ist meines Wissens nach die einzige Möglichkeit.

Zitat:

Zitat von Captnemo (Beitrag 1317988)
Ist ja auch wirklich blöd.....steht sicher irgendwo in der Hilfe, aber da wär ich so nie drauf gekommen.

Habs damals auch erst nach einiger Recherche herausgefunden :| Welchen tieferen Sinn diese Einschränkung hat, erschließt sich mir allerdings auch nicht.

Uwe Raabe 8. Okt 2015 09:09

AW: Case in Record
 
Zitat:

Zitat von Captnemo (Beitrag 1317988)
steht sicher irgendwo in der Hilfe, aber da wär ich so nie drauf gekommen.

Ja, hier:
Zitat:

Ein Record-Typ kann einen varianten Teil enthalten, der einer case-Anweisung ähnelt. Dieser variante Teil muss in der Typdeklaration nach den Feldern angegeben werden.
Aber auch schon hier:
Zitat:

A field list can have only one variant part and it must succeed the fixed part(s).(However, a variant part may itself contain variants. Hence, it is possible to have nested variants.)
Auszug aus Pascal, User Manual and Report (1978). Diese Einschränkung ist also aus dem ursprünglichen Pascal übernommen worden. Über die damaligen Gründe kann man wohl nur spekulieren.

Da merkt man doch, wie lange man schon dabei ist: Daß Varianten ans Ende gehören war mir schon so in Fleich und Blut übergegangen - ich wäre nie darauf gekommen, daß es womöglich anders sein könnte.

Mavarik 8. Okt 2015 09:25

AW: Case in Record
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1318012)
Da merkt man doch, wie lange man schon dabei ist: Daß Varianten ans Ende gehören war mir schon so in Fleich und Blut übergegangen - ich wäre nie darauf gekommen, daß es womöglich anders sein könnte.

Oh ja...

:glaskugel: Der Record hat ja die Länge der "normalen" Felder Plus die Länge der größten Feld-Size-Summe des Case Eintrages.

Jeder Case Eintrag kann ja mehrere Felder haben. Das ist jedoch nur was der Sizeof zurück gibt. So ein Varianten Record bot sich immer an um Speicher zu sparen (z.B. wenn man diesen in eine Datei schreibt). Da würde eine veränderliche Größe in der Mitte nix bringen.

Mavarik

p80286 8. Okt 2015 09:53

AW: Case in Record
 
Ich meine mich zu erinnern, daß es auch so gehen könnte:

Delphi-Quellcode:
    DRIVE_LAYOUT_INFORMATION_EX = record
      PartitionStyle: DWORD;
      PartitionCount: DWORD;
      case Integer of
        0: (Mbr: DRIVE_LAYOUT_INFORMATION_MBR;
            partitionInfoEx: array of _PARTITION_INFORMATION_EX; );
        1: (Gpt: DRIVE_LAYOUT_INFORMATION_GPT
            partitionInfoEx: array of _PARTITION_INFORMATION_EX;);
    end;
Bin mir über die korrekte Syntax nicht im Klaren.

Gruß
K-H

mkinzler 8. Okt 2015 09:57

AW: Case in Record
 
Aber wie schon erwähnt nur für das letzte member.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:46 Uhr.
Seite 1 von 2  1 2      

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