2017-12-07 7 views
-1

파스칼을 잘 아는 사람들로부터 도움이 필요합니다.파스칼 변종 레코드의 사용

변형 레코드를 사용하려면 (선생님 요구 사항) 필요합니다. 그 변형 기록은 다음과 같이 정의된다 :이 주제에 대한 내 연구에서 발견 된 주요 자료에 따르면

Temperature = record 
    case scale : TemperatureScale of 
    celsius : (celsius_value : ScaleCelsius); 
    kelvin : (kelvin_value : ScaleKelvin); 
end; 

, 내가 변형 기록을 사용하는 방법을 찾을 수 없습니다 만 어떻게 선언합니다.

내 주요 자료 :

type 
    UkPolozka = ^Polozka; 
    UkHodnota = ^Hodnota; 
    TypUdaj=(typretez, typcele, typrealne, typlogik, typpole, typobjekt); 

    VarZaznam = record 
    case Udaj: TypUdaj of   
    typretez: (retez: string); 
    typcele: (cele: word); 
    typrealne: (realne: single); 
    typlogik: (logik: boolean); 
    typpole: (pole: UkHodnota); 
    typobjekt: (objekt: UkPolozka); 
end; 

Polozka = record 
    Nazev: string; 
    Hodn: VarZaznam; 
    Dalsi: UkPolozka 
end; 
Hodnota = record 
    Hodn: VarZaznam; 
    Dalsi: UkHodnota  
end; 
+0

당신은 특정 문제를 설명하지 않았다. 유용한 변형 레코드의 예로는 https://www.freepascal.org/docs-html/rtl/sysutils/longrec.html을 고려하십시오. – MBo

+0

레코드 필드 'scale'이'celsius' 인 경우, 변형 부분에는'celsius_value'가 포함됩니다. 'kelvin'이라면, 변형 부분은'kelvin_value'를 포함합니다. 변형 파트는 변형 설명자에 따라 여러 해석을위한 공간을 공유합니다. 변형 설명자는 유형으로 만 지정할 수도 있습니다. 'case boolean of'입니다. –

+0

@mbo 레코드의 그림 형식은 무엇입니까? 그리고 그것으로부터 읽는 방법? – gussPepe

답변

0

Delphi Help에서 예를 들어 기록을 고려 : 구글 검색 (발견 아무것도), Case-Freepascal 및 구현에 내가 사용해야하는지 궁금 사람들 Record-Freepascal

편집이 exacly이있다 . 태그로 수정했습니다.

태그 사용은 선택 사항이며 일반적으로 사용되지 않으며 유용한 정보를 제공하지 않습니다.
첫 번째 라인은 높이와 같은 값을 가진 반지름을 출력합니다 - 그들은 같은 메모리를 공유합니다.

은 그럼 내가 명시 적으로 태그를 설정합니다 (그러나 필드는 동일하게 유지)

은 또한 노 태그 레코드의 크기 차이를 기록하고 하나의 태그.

참고 - 대부분의 경우 프로그래머는 태그 값을 정의하거나 사용하지 않습니다. 태그에 의존하는 것이 안전하지 않을 수 있습니다 (태그를 지정할 때 엄격한 규칙을 따를 때까지). 나는 rectangle 태그를 설정하지 않았지만 프로그램은 제로 태그를 첫 번째 변형으로 간주합니다.

이름으로 필요한 필드를 지정하기 만하면됩니다. 필요한 필드를 이름으로 읽으십시오. 귀하의 예를 델파이 varVarZaznam.retez:= 'test';

type 
    TShapeList = (Rectangle, Triangle, Circle, Ellipse, Other); 
    TFigure = record 
    case shape: TShapeList of 
     Rectangle: (Height, Width: Real); 
     Triangle: (Side1, Side2, Angle: Real); 
     Circle: (Radius: Real); 
     Ellipse, Other:(); 
    end; 

    TFigureNoTag = record 
    case TShapeList of 
     Rectangle: (Height, Width: Real); 
     Triangle: (Side1, Side2, Angle: Real); 
     Circle: (Radius: Real); 
     Ellipse, Other:(); 
    end; 

var 
    Fig: TFigure; 
begin 
    Fig.Height := 5; 
    Fig.Width := 3; 
    //default tag is zero = Rectangle 
    if Fig.shape = Rectangle then 
    Writeln('Rect ', Fig.Height:3:0, Fig.Width:3:0, Fig.Radius:3:0) 
    else 
    Writeln('not Rect'); 

    Fig.shape := Circle; 
    if Fig.shape <> Rectangle then 
    Writeln('not Rect'); 

    Writeln('Fig size ', SizeOf(TFigure), ' noTag size ', SizeOf(TFigureNoTag)); 
    Readln; 

출력의 경우 :

Rect 5 3 5 
not Rect 
Fig size 32 noTag size 24 
+0

이것은 preatty 좋은 예처럼 보인다 ... 또한 합법 나는 아마 태그를 설정할 필요가있을 것이다. 하나의 큰 dinamic 구조 (교사의 요구 사항)에 메모리에 저장하고 그것으로 물건을 ... 그리고 또한 내가 태그를 설정하는 방법을 알아야합니다 – gussPepe

+0

태그는 단순히 필드입니다. 레코드의 다른 필드와 마찬가지로 설정하십시오. –

+0

내 예제에는 'Fig.shape : = Circle; 태그 설정이 포함되어 있습니다. – MBo