On 2022-12-24 13:44, AdaMagica wrote:
> I've got a task type with a discriminant:
>
> type Index is range 1 .. N;
>
> task type T (D: Index);
>
> Now I want an array of these tasks, where each task knows its
> identity (the index) via the discriminant, an
> iterated_component_association: >
> Arr: array (Index) of T := (for I in Index => ???);
>
> How can I do this?
One way is to give the discrimant a default value that is a function
call that returns a new identifier on each call:
Next_Index : Index := Index'First;
-- The value returned by the next call of New_Index.
function New_Index return Index
-- Returns a unique Index value (up to N).
is
Result : constant Index := Next_Index;
begin
if Next_Index < Index'Last then
Next_Index := Next_Index + 1;
-- else report error?
end if;
return Result;
end New_Index;
task type T (D: Index := New_Index);
Then you can declare the array without any initial value:
Arr: array (Index) of T;
and the initialization of each task in the array makes its own call to
New_Index and gets its own identifier value.
A bit sneaky, but has the advantage that it extends automatically to
two arrays of tasks, or one array and some separate single declarations
of tasks, etc.