![]() |
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:
Nun würde ich in Delphi folgendes schreiben:
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 };
Delphi-Quellcode:
Aber: Was bedeutet hier dieses "Integer" oder woher weiß ich welchen Wert er annimmt für meine 2 Strukturen?
TMatrix = record
case Integer of 0: (m11,m12,...:Real); 1: (MyMatrix : array[0..3,0..3] of Real); end; Hoffe mir kann das jemand erklären :) |
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:
Hier ist vorgesehen, dass TFoo.a gültig ist, wenn tag 0 ist, und TFoo.b, wenn tag 1 ist.
TFoo = record
case tag: Integer of 0: (a: TA); 1: (b: TB); end; 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. |
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:
also das Entsprechen = in Bezug auf den Speicheraufbau des Records.
TMatrix = record
case x: TYP of ... end; // entspricht TMatrix = record x: TYP; case TYP of ... end; // entspricht TMatrix = record x: TYP; ... end; [edit] OK, da war zwar wer schneller, aber was soll's :roll: |
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 11:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz