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.
--- SoupGate-Win32 v1.05
* Origin: fsxNet Usenet Gateway (21:1/5)