Использование ключевого слова TYPE в Pascal - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь понять определение ключевого слова TYPE в паскале.Я понимаю, что typedef в C просто дает новое имя для типа (alasing).Но, как я понимаю, TYPE в Паскале не работает таким образом.Это создаст новый уникальный тип.

Я пытался найти и создать простой пример, который показывает механизм TYPE.Я попытался создать пример, который создает некоторые типы и функции.После этого каждый раз передается один из типов этой функции.Это должно завершиться сбоем, потому что функция должна получить только один тип, что доказывает, что эти типы не просто псевдонимы.Из-за недостатка знаний о синтаксисе Паскаля я каждый раз терпел неудачу.

Не могли бы вы поделиться простой короткой программой, которая доказывает силу TYPE?

РЕДАКТИРОВАТЬ :

Я создал следующий пример:

program Check;
TYPE
    Meters = Real; Seconds = Real;

VAR
    m: Meters; s: Seconds;

Procedure PRINT_SEC(s: Seconds);
    Begin
        WriteLn(s, ' sec');
    end;

Begin
    PRINT_SEC(s);
    PRINT_SEC(m);
end.

Вывод:

0.0000000000000000E+000 sec
0.0000000000000000E+000 sec

Но почему это не дает сбоя?Я прошел m который имеет тип Meters нет?Кроме того, как я могу инициализировать эти переменные?

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Во-первых, в Pascal ключевое слово TYPE не создает типы. Ключевое слово TYPE должно встречаться перед определениями типов, но именно определения типов МОГУТ создавать типы. Не все определения типов создают типы.

Стандарт Паскаля говорит следующее:

A type-definition shall introduce an identifier to denote a type.

, что означает, что определение типа вводит (т. Е. Создает или переопределяет) идентификатор, который обозначает (т. Е. Является псевдонимом) тип.

Стандарт Паскаля определяет определение типа как:

type-definition = identifier '=' type-denoter

type-denoter = type-identifier | new-type

new-type = new-ordinal-type | new-structured-type | new-pointer-type

Что означает, что определение типа является идентификатором, за которым следует одинаковая сторона, за которой следует денотер типа Denoter типа - это либо идентификатор типа, либо новый тип.

Таким образом, идентификатор типа вводит идентификатор, который обозначает (т.е. является псевдонимом) либо идентификатор другого типа, либо новый тип. Тип создается только в том случае, если denoter типа является новым типом.

Итак, в вашем примере:

TYPE
    Meters = Real; Seconds = Real;

Denoter типа в обоих определениях типа является идентификатором типа Real, поэтому Meters и Seconds являются псевдонимами для Real.

Да, в Pascal, Real не является типом, это встроенный идентификатор типа для реального типа.

Стандарт Паскаля гласит

Обязательный идентификатор типа real должен обозначать вещественный тип.

То есть real на самом деле является идентификатором типа, а не типом. Как будто существует невидимое определение типа.

TYPE
    Real = real-type;

где реальный тип - фактический реальный тип.

0 голосов
/ 25 января 2019

Переменные типа m и s определяются типом. В этом случае оба типа происходят из типа real. Это называется type alias. Они совместимы как по типу, так и по назначению.

Если вы хотите отдельный тип (во Freepascal и delphi), определите:

type Seconds = type real; 

Это заставило бы процедуру печати принимать только аргумент типа Seconds. Обратите внимание, что переменные Seconds и Meters, объявленные как отдельные типы, по-прежнему совместимы по присваиванию.

Чтобы инициализировать переменные, просто присвойте значение:

s := 42.0;

Примечание: большинство типов имеют имена, начинающиеся с T. Как TSeconds. Просто чтобы отличить их от переменных. Это общее соглашение (на паскале).

...