Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi One more time: c Header samt Union in Delphi übersetzen (https://www.delphipraxis.net/142064-one-more-time-c-header-samt-union-delphi-uebersetzen.html)

MisterNiceGuy 21. Okt 2009 13:44


One more time: c Header samt Union in Delphi übersetzen
 
Hi, gibt zwar einige Themen die die Problemstellung behandeln aber keiner erklärt was genau passiert passiert.

Ich hab folgende C-Struktur:
Code:
   union
   {
      struct
      {
         float m11, m12, m13, m14,   // Elemente der Matrix
              m21, m22, m23, m24,
              m31, m32, m33, m34,
              m41, m42, m43, m44;
      };

      float      m[4][4];         // Zweidimensionales Array der Elemente
   };
Nun würde ich in Delphi folgendes schreiben:

Delphi-Quellcode:
TMatrix = record
    case Integer of
      0: (m11,m12,...:Real);
      1: (MyMatrix : array[0..3,0..3] of Real);
  end;
Aber: Was bedeutet hier dieses "Integer" oder woher weiß ich welchen Wert er annimmt für meine 2 Strukturen?

Hoffe mir kann das jemand erklären :)

Apollonius 21. Okt 2009 13:55

Re: One more time: c Header samt Union in Delphi übersetzen
 
Das "Integer" ist nicht wichtig. Du könntest auch Boolean nehmen und dann statt 0 und 1 True und False. Du brauchst nur einen ordinalen Typen und kannst mit dessen Werten dann die Möglichkeiten durchnummerieren.

Die Syntax stammt daher, dass es in Delphi auch "tagged unions" gibt:
Delphi-Quellcode:
TFoo = record
  case tag: Integer of
    0: (a: TA);
    1: (b: TB);
end;
Hier ist vorgesehen, dass TFoo.a gültig ist, wenn tag 0 ist, und TFoo.b, wenn tag 1 ist.
Delphi überprüft zur Laufzeit zwar nicht, ob auf die Teile des Records nur beim gültigen Tag zugegriffen wird, aber die Syntax ist im Sinne von selbstdokumentierendem Code recht interessant.

himitsu 21. Okt 2009 13:58

Re: One more time: c Header samt Union in Delphi übersetzen
 
Integer ist hier einfach nur zur Unterscheidung der Typen und es ist in diesem Sinne kein Felsd dafür im Record angelegt

Es sei denn du gibst zusätzlich noch einen Variablenbezeichner mit an

Das Programm sagt dir nicht, welcher Teil nun genutzt wird, das kannst/mußt du selber machen
und selbst das ist nichtmal verbindlich (man kann "0" eintragen und dennoch auf "1" zugreifen)

Delphi-Quellcode:
TMatrix = record
    case Integer of
      0: (...);
      1: (...);
  end;

TMatrix = record
    case Boolean of
      false: (...);
      true: (...);
  end;

TSet = (a, b, d);
TMatrix = record
    case TSet of
      a: (...);
      b: (...);
      c: (...);
  end;

Delphi-Quellcode:
TMatrix = record
    case TYP of
      ...
  end;
// entspricht
TMatrix = record
  ...
end;
Delphi-Quellcode:
TMatrix = record
    case x: TYP of
      ...
  end;
// entspricht
TMatrix = record
    x: TYP;
    case TYP of
      ...
  end;
// entspricht
TMatrix = record
    x: TYP;
    ...
  end;
also das Entsprechen = in Bezug auf den Speicheraufbau des Records.

[edit]
OK, da war zwar wer schneller, aber was soll's :roll:

MisterNiceGuy 21. Okt 2009 15:01

Re: One more time: c Header samt Union in Delphi übersetzen
 
Hey ihr 2, vielen Dank für die Antwort, hab's verstanden und verinnerlicht :)

Edit

Halt, stopp... geht das auch für 3 Strukturen? Sprich sowas:

Delphi-Quellcode:
type
TMatrix = packed record
  case Integer of
  0: (m11, m12, m13, m14,
      m21, m22, m23, m24,
      m31, m32, m33, m34,
      m41, m42, m43, m44 : Real);
  1: (matrix : array[0..3,0..3] of Real);
  2: (matrix1D : array[0..15] of Real);
end;


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