From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on ip-172-31-65-14.ec2.internal X-Spam-Level: X-Spam-Status: No, score=-3.2 required=3.0 tests=BAYES_00,NICE_REPLY_A, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 Path: eternal-september.org!reader01.eternal-september.org!news.szaf.org!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Niklas Holsti Newsgroups: comp.lang.ada Subject: Re: Arrays with discriminated task components Date: Sat, 24 Dec 2022 20:05:19 +0200 Organization: Tidorum Ltd Message-ID: References: <9b729cf0-02c7-48e1-8cea-c0d177c4bf3bn@googlegroups.com> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net 34g712XPyjb3D/ff1IBmmwn9lW31oXkNNaw6ZZfXK2FxJ1QbTr Cancel-Lock: sha1:EQnJPAzetRlmv8rTj9t8ZJKnbng= User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:102.0) Gecko/20100101 Thunderbird/102.5.1 Content-Language: en-US In-Reply-To: <9b729cf0-02c7-48e1-8cea-c0d177c4bf3bn@googlegroups.com> Xref: reader01.eternal-september.org comp.lang.ada:64729 List-Id: 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.