comp.lang.ada
 help / color / mirror / Atom feed
From: Niklas Holsti <niklas.holsti@tidorum.invalid>
Subject: Re: Pass a serial port as user data in a GTK callback handler?
Date: Sun, 16 Feb 2014 09:45:05 +0200
Date: 2014-02-16T09:45:05+02:00	[thread overview]
Message-ID: <bmb8k0F13aiU1@mid.individual.net> (raw)
In-Reply-To: <bmabpcFq9c8U1@mid.individual.net>

On 14-02-16 01:32 , hreba wrote:
> Hi,
> 
> I am new to Ada and still overwhelmed by the complexity of the language.
> 
> My actual programming exercise has a GTK GUI, and I want a callback
> handler to communicate through a serial port, so I need to pass the port
> in my user data, which must be of
> 
>    type User_Type (<>) is private;
> 
> which means it must be nonlimited.
> 
> But GNAT.Serial_Communications.Serial_Port is limited:
> 
>    type Serial_Port is new Ada.Streams.Root_Stream_Type with private;
>    type Root_Stream_Type is abstract tagged limited private;
> 
> I tried to pass a reference to the port, and it must be an "access all"
> (because it is not allocated by my, but a preexisting variable (hardware
> resource), as I understand it):

On my machine (Win 7), the type Serial_Port is declared in
GNAT.Serial_Communications by deriving from
Ada.Streams.Root_Stream_Type, adding a component which refers AIUI to a
Windows "handle". This is definitely a SW object; the HW resource is
hidden beind Windows.

On some bare-machine GNAT port, Serial_Port might be closer to the HW,
but it is no doubt still a stream class, so it will not itself be mapped
to some HW register. It might contain the address of (i.e. a reference
to) a HW register.

Therefore, you should be able to create your own Serial_Port objects on
the stack, on the heap, or statically.

>    port: access all GNAT.Serial_Communications.Serial_Port;
> 
> But then I get an error message
> 
>    "all" is not permitted for anonymous access types.
> 
> Is there a solution?

Give the type a name so that it isn't "anonymous":

   type Port_Ref is access all GNAT.Serial_Communications.Serial_Port;

   port : Port_Ref;

Also remember to mark the actual Serial_Port object as "aliased" so that
you can take its 'Access.

-- 
Niklas Holsti
Tidorum Ltd
niklas holsti tidorum fi
      .      @       .


  parent reply	other threads:[~2014-02-16  7:45 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-15 23:32 Pass a serial port as user data in a GTK callback handler? hreba
2014-02-16  0:35 ` Jeffrey Carter
2014-02-16 16:18   ` hreba
2014-02-16  7:45 ` Niklas Holsti [this message]
2014-02-16 16:14   ` hreba
2014-02-16  9:20 ` Dmitry A. Kazakov
2014-02-16 16:57   ` hreba
2014-02-16 18:02     ` Dmitry A. Kazakov
2014-02-17 16:13 ` adambeneschan
2014-02-17 16:20   ` adambeneschan
2014-02-17 21:31     ` Robert A Duff
2014-02-19  0:53       ` Randy Brukardt
2014-02-19 22:22         ` Robert A Duff
2014-02-20  0:34           ` Randy Brukardt
2014-02-20 11:07             ` Simon Wright
2014-02-20 16:11             ` Robert A Duff
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox