AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi One more time: c Header samt Union in Delphi übersetzen

One more time: c Header samt Union in Delphi übersetzen

Ein Thema von MisterNiceGuy · begonnen am 21. Okt 2009 · letzter Beitrag vom 21. Okt 2009
Antwort Antwort
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#1

One more time: c Header samt Union in Delphi übersetzen

  Alt 21. Okt 2009, 13:44
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
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: One more time: c Header samt Union in Delphi übersetzen

  Alt 21. Okt 2009, 13:55
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.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.497 Beiträge
 
Delphi 12 Athens
 
#3

Re: One more time: c Header samt Union in Delphi übersetzen

  Alt 21. Okt 2009, 13:58
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von MisterNiceGuy
MisterNiceGuy

Registriert seit: 1. Jul 2003
Ort: Mannheim
919 Beiträge
 
Delphi 7 Personal
 
#4

Re: One more time: c Header samt Union in Delphi übersetzen

  Alt 21. Okt 2009, 15:01
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;
Jonas
Wenn mich jemand sucht, ich bin im Kühlschrank!

Informationen über das Duale Studium
www.jofre.de
  Mit Zitat antworten Zitat
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 06:38 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