2016-04-08 11 views
1

Ich bin etwas verwirrt, einen Abschnitt von ISO Pascal zu sehen.ISO Pascal Record-Varianten ohne Feldname

Die Grammatik ermöglicht es Ihnen, dies zu tun:

type RPoint = Record 
    Case Boolean of 
    False : (X,Y,Z : Real); 
    True : (R,theta,phi : Real); 
end; 

es zu konstruieren, was Sie tun:

var p: RPoint; 
begin 
    p.x := 1; 
end. 

Es gibt einen Teil verstehe ich nicht: Was ist der Zweck des Case Boolean Teil? Ich verstehe, dass Sie case MyVal: Boolean tun können; dann wird MyVal der Feldwähler. Was ist jedoch der Zweck, wenn es keine Feldauswahl gibt, nur einen Typ?

Darüber hinaus ist die Norm sagt:

Bei jeder Variante-Teil ist eine Art der Selektor-Typ durch die varianten Teil besessen bezeichnet zugeordnet werden. Enthält der Varianten-Selektor des Varianten-Teils ein Tag-Feld oder enthält die Fall-Konstanten- Liste jeder Variante des Varianten-Teils nur eine Fall-Konstante, so ist der Selektor-Typ mit zu bezeichnen der Tag-Typ und jede Variante des Variant-Teils müssen mit den Werten verknüpft werden, die durch den Selektor-Typ spezifiziert sind, der durch die Fallkonstanten der Fall-Konstanten-Liste der Variante angegeben ist. Andernfalls muss der Selektyp des Variantenteils ein neuer Ordinaltyp sein, der so aufgebaut ist, dass er genau einen Wert für jede Variante des Variantenteils besitzt, und , wobei jede dieser Varianten zugeordnet werden muss ein eindeutiger Wert dieses Typs.

Ich verstehe nicht ganz, was die selector-type ist und warum es wäre ein neues ordinal-type sein. Wäre der selector-type nicht einfach der Typ wie in case Boolean of? Und was hat jeder case-constant-list mit nur einem case-constant damit zu tun?

+0

In der Vergangenheit war die comp.lang.pascal.ansi-iso-Newsgroup die beste Quelle für ISO Details und trotz dass es Aktion seit Jahren nicht mehr gesehen hat, könnte es noch lurkers sein. Ansonsten versuchen Sie die Gnu Pascal (GPC) -Dokumentation zu diesem Thema zu durchsuchen. –

Antwort

2

Hier hat Ihre Variante Datensatz zwei mögliche 'Persönlichkeiten'. Boolean ist ein Typ mit zwei möglichen Werten. Es schien also eine logische Entscheidung zu sein. Aber es muss nicht boolesch sein.

Sie könnten einen anderen Ordinaltyp wie Integer oder Byte verwendet haben, um denselben Effekt zu erhalten. Zum Beispiel:

type RPoint = Record 
    Case Byte of 
    0: (X,Y,Z : Real); 
    1: (R,theta,phi : Real); 
end; 
+0

Also dient der Typ keine tatsächliche Laufzeitdarstellung? Es ist nur für die Definition der verschiedenen "Persönlichkeiten"? – refi64

+0

Genau. Es ist nur ein Typ für was später für jeden Fall verwendet wird. Es ist nur nützlich für den Compiler. Es gibt keinen Laufzeitspeicher dafür. – tonypdmtr

+0

Noch eine Frage: Was bedeutet das Ganze über "case-constant" zu haben? Oder ist es einfach nutzlos "Standard" Mist? – refi64