AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Case in Record

Ein Thema von Captnemo · begonnen am 8. Okt 2015 · letzter Beitrag vom 8. Okt 2015
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Case in Record

  Alt 8. Okt 2015, 07:27
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?
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Case in Record

  Alt 8. Okt 2015, 07:32
Wenn ich mich recht erinnere akzeptiert Delphi Unions (case in records) ausschließlich beim letzten Feld des Records.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#3

AW: Case in Record

  Alt 8. Okt 2015, 07:34
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;
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.658 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Case in Record

  Alt 8. Okt 2015, 07:36
.. 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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#5

AW: Case in Record

  Alt 8. Okt 2015, 07:38
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.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#6

AW: Case in Record

  Alt 8. Okt 2015, 07:41
Genau, das ist meines Wissens nach die einzige Möglichkeit.

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.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
9.716 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Case in Record

  Alt 8. Okt 2015, 09:09
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.070 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Case in Record

  Alt 8. Okt 2015, 09:25
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...

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
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Case in Record

  Alt 8. Okt 2015, 09:53
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.828 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Case in Record

  Alt 8. Okt 2015, 09:57
Aber wie schon erwähnt nur für das letzte member.
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 01:57 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf