From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.3 required=5.0 tests=BAYES_00,INVALID_MSGID autolearn=no autolearn_force=no version=3.4.4 X-Google-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,e9f44aef4f5aee18 X-Google-Attributes: gid103376,public From: tmoran@bix.com Subject: Re: Access to procedures Date: 1999/06/25 Message-ID: #1/1 X-Deja-AN: 493842363 References: <37737285.5CF9ED5F@Maths.UniNe.CH> article X-Complaints-To: abuse@pacbell.net X-Trace: typhoon-sf.snfc21.pbi.net 930331865 206.170.2.205 (Fri, 25 Jun 1999 10:31:05 PDT) Organization: SBC Internet Services NNTP-Posting-Date: Fri, 25 Jun 1999 10:31:05 PDT Newsgroups: comp.lang.ada Date: 1999-06-25T00:00:00+00:00 List-Id: >"subprogram must not be deeper than access type" >even when it doesn't seem depper at all! Your "main program" is in fact a procedure, and procedure My_feedback is inside that (main program) procedure. Consider what would happen if you started up another task, passed an access to My_feedback to it, and then let the "main program" go to completion. The task would then be able to call My_feedback, which might try to use variables declared in "procedure main_program", but those variables no longer exist. >So, my question is: how to do it ? How about adding a dummy tagged type parameter to Extract, where Extract's "proc" call dispatches on the dummy tagged type. eg something like: modify Extract's spec to package whatever is ... type feedback_selector is abstract tagged null record; procedure proc ( Which_Feedback : in out feedback_selector; percents_done: natural; user_abort: out boolean) is abstract; procedure Extract(from : zip_info; what : String; method : out pkzip_method; feedback : feedback_selector'class);  and inside of Extract, make calls on proc(feedback, percents_done=>xxx, user_abort=>yyy); which will call the "proc" procedure for the particular "feedback". Then any time you need to make one or more particular feedback procs package feedback_handlers is ... type My_feedback is new whatever.feedback_selector; procedure proc ( Which_Feedback : in out My_feedback; percents_done: natural; user_abort: out boolean); type Your_feedback is new whatever.feedback_selector; procedure proc ( Which_Feedback : in out Your_feedback; percents_done: natural; user_abort: out boolean); ... end feedback_handlers; package body feedback_handlers is procedure proc ( Which_Feedback : in out My_feedback; percents_done: natural; user_abort: out boolean) is new_done_dots: natural:= (dots * percents_done) / 100; begin for i in done_dots .. new_done_dots loop Put('.'); end loop; user_abort:= false; end proc; procedure proc ( Which_Feedback : in out Your_feedback; percents_done: natural; user_abort: out boolean) is ... end feedback_handlers; and to use them procedure Do_Unzip is Feedback1 : feedback_handlers.My_feedback; Feedback2 : feedback_handlers.Your_feedback; -- for instance begin ... whatever.Extract(zi, Argument(i), method, Feedback1 ); ... end Do_unzip; (typed but not tested) >NB: a generic solution doesn't seem a solution as some packages, >basically non-generic, have to call the feedback procedure; making Those packages would just 'with whatever' and take a whatever.feedback_selector'class parameter. To call one of those routines with a specific proc in mind, just pass it an object of the appropriate kind. Essentially, instead of passing "proc1'access" or "proc2'access", you pass in Feedback1 or Feedback2, or ...