Ада перечислимый диапазон типов - PullRequest
5 голосов
/ 07 сентября 2011

Насколько я понимаю, Ада использует нумерованные индексы для своих перечислимых типов. Таким образом, в Status_Type ниже порядковое значение изменяется от 0 до 5.

   type Status_Type is
     (Undefined,  
      Available,
      Fout,     
      Assigned,     
      Effected,  
      Cleared); 

Мой вопрос: каковыпорядковые значения для следующих примеров?Они начинаются с 0 или начинаются с порядкового значения супертипа?

   subtype Sub_Status_Type is Status_Type
     range Available.. Effected;

   subtype Un_Status_Type is Sub_Status_Type
     range Fout .. Assigned;

Будут ли порядковые значения Sub_Status_Type идти от 1 до 4 или от 0 до 3?

Будет Un_Status_Typeпорядковые значения идут от 3 до 4 или от 1 до 2 или от 0 до 1?

Ответы [ 4 ]

9 голосов
/ 07 сентября 2011

Для подтипов 'pos вернет то же значение, что и для базового типа (я полагаю, 1..4 и 2..3 соответственно). Подтипы на самом деле не являются новыми и разными типами, поскольку они того же старого типа, но с некоторыми дополнительными ограничениями на возможные значения.

Но следует отметить, что эти значения присваиваются под сценами. Это действительно не должно иметь никакого значения для вас, чем они являются , если только вы не используете атрибуты 'val и 'pos или не взаимодействуете с кодом, написанным вне Ada (или для аппаратного обеспечения).

Плюс, если это действительно в конечном итоге имеет значение, вы должны знать, что на самом деле ситуация намного сложнее. 'pos и 'val не возвращают фактическое значение бита, которое компилятор использует для этих значений перечисления при генерации кода. Они просто возвращают свое «порядковое положение»; их смещение от первого значения.

По умолчанию они обычно будут одинаковыми. Однако вы можете изменить присвоения значений (но не присвоения порядковых позиций) самостоятельно с помощью предложения for ... use, как показано в приведенном ниже коде:

for Status_Type use
 (Undefined => 1,  
  Available => 2,
  Out       => 4,     
  Assigned  => 8,     
  Effected  => 16,  
  Cleared   => 32); 
5 голосов
/ 07 сентября 2011

Номер позиции определяется в терминах базового типа. Таким образом, Sub_Status_Type'Pos(Assigned) совпадает с Status_Type'Pos(Assigned), а значения позиции Sub_Status_Type изменяются от 1 до 4, а не от 0 до 3.

(И обратите внимание, что на номер позиции не влияет предложение представления перечисления; оно всегда начинается с 0 для первого значения базового типа.)

Между прочим, это было бы достаточно легко выяснить, запустив небольшую тестовую программу, которая печатает значения Sub_Status_Type'Pos(...), которая также сказала бы, что вы не можете использовать зарезервированное слово out идентификатор.

2 голосов
/ 08 сентября 2011

Насколько я понимаю, Ada использует 0 на основе индексов для своих перечисляемых типов

Да, он использует 0 для индексов или, скорее, для позиции значений типа.Это не значение литералов перечисления, а не их двоичное представление.

каковы порядковые значения для следующих примеров?

Нет «порядковых» значений.Значения типа - те, которые вы указали.Здесь вы путаете «значение», «представление» и «положение».

Значения ваших Status_Type: Undefined, Available, Out, Assigned, Effectedи Cleared.

Позиции 0, 1, 2, 3, 4 и 5. Это то, что вы можете использовать для перевода с 'Pos и 'Val.

Представление по умолчанию соответствует позиции, но вы можете свободно назначать другие значения (при условии, что вы сохраняете правильный порядок).Они используются, если вы записываете его в файл, отправляете через сокет или загружаете в регистр.

1 голос
/ 08 сентября 2011

Я думаю, что лучший способ ответить на ваши вопросы в обратном порядке:

Подтип, математически говоря, является непрерывным подмножеством своего родительского типа. Таким образом, если тип SIZES (1, 2, 3, 4, 5, 6, 7, 8) и вы определяете подтип MEDIUM как (4,5), первый элемент MEDIUM равен 4. Пример:

Type Small_Natural is 0..16;
Subtype Small_Positive is Small_Natural'Succ(Small_Natural'First)..Small_Natural'Last;

Это определяет два небольших набора возможных значений, которые тесно связаны между собой: а именно, что положительными числами являются все натуральные числа, кроме нуля.

Я использовал эту форму, чтобы проиллюстрировать, что с несколькими изменениями текста у нас есть следующий пример:

Type Device is ( Not_Present, Power_Save, Read, Write );
Subtype Device_State is Device'Succ(Device'First)..Device'Last;

И здесь мы моделируем интуитивное представление о том, что устройство должно присутствовать, чтобы иметь состояние, но обратите внимание, что значения в подтипе являются [точно] значениями в типе, из которого они получены.

Это отвечает на ваш второй вопрос: Да, элемент перечисления будет иметь то же значение, что и его родительский тип.

Что касается первого, я полагаю, что начальная позиция фактически определяется реализацией (если нет, то я предполагаю, что LM по умолчанию принимает значение 0). Однако вы можете переопределить это и указать собственную нумерацию, единственное ограничение состоит в том, что элементы в начале перечисления оцениваются меньше значения, которое вы назначаете в настоящее время [IIRC].

...