Создание задачи в ADA

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

Вот мой код:

task type FEP_Con(Port_Num :  Port_Name) is
  entry Start;
end FEP_Con;

type FEP_Con_acc is access FEP_Con;

task body FEP_Con is
  S_Port : Serial_Port;
  Buffer : Ada.Streams.Stream_Element_Array(1..1024);
  Last   : Ada.Streams.Stream_Element_Offset;
  Response_Str : Unbounded_String;
  --cPort : Port_Name := "";
begin
  accept Start;

Заранее спасибо.


person Iman    schedule 08.05.2014    source источник


Ответы (1)


Хотя определение типа для «Port_Name» не предоставлено, на основе имени дискриминанта я предполагаю, что это строка фиксированной длины или Unbounded_String или что-то в этом роде. Ни один из них не является дискретным или ссылочным.

Дискретные типы — это «либо целые типы, либо определяются перечислением их значений (типы перечисления)». RM 3.2[3]

тип доступа – это тип "указатель". .

Таким образом, для дискриминанта вашей задачи вы можете использовать некоторый целочисленный тип, который не обязательно означает производный или подтип от Integer, а просто подсчитывающий целочисленный тип, например. type Port_Name_IDs is range 1 .. 100;

Или вы можете определить свои Port_Names как перечисление, например:

type Port_Name is (Haifa, Amsterdam, Long_Beach);

Или определите тип доступа, ссылающийся на ваш существующий тип Port_Name, например:

type Port_Name_Ref is access Port_Name;
person Marc C    schedule 08.05.2014
comment
Или что-то вроде task type FEP_Con (Port_Num : access constant Port_Name). - person Simon Wright; 08.05.2014
comment
Спасибо, Марк и Саймон, с перечислением это сработало. Хотя я не мог применить предложение Саймона, так как не мог передать имя порта типу «константа доступа Port_Name». (Port_Name — это тип, определенный в GNAT.Serial_Communication) - person Iman; 09.05.2014
comment
Вам необходимо предоставить доступ к значению. См. dropbox.com/s/hun5qfs54g9pspv/test_discrims.adb (не загрязнять пространство SO с другим ответом!) - person Simon Wright; 09.05.2014