comp.lang.ada
 help / color / mirror / Atom feed
From: Martin Krischik <krischik@users.sourceforge.net>
Subject: Re: Pass by reference
Date: Thu, 08 Apr 2004 20:21:03 +0200
Date: 2004-04-08T20:21:03+02:00	[thread overview]
Message-ID: <54077117.Uc4Ikxz6le@linux1.krischik.com> (raw)
In-Reply-To: 19b0e504.0404080652.4eab9f80@posting.google.com

Dan McLeran wrote:

> I am investigating using Ada for a project at work and I have a
> question I hope someone can answer. If I am interpreting the RM
> section 6.2 correctly, an array of elementary types does not meet the
> criteria of a by-reference type. But, when looking at the disassembly,
> it seems that passing an array of elementary types to a function as an
> in-mode parameter is passing by reference. Does this mean that an
> array of elementary types is an unspecfied type?

Good Ada compiler will do what is best. So "array (1 .. 2) of Character" is
likely to be passed by value while "array (1 .. 10_000) of Integer" is
probably passed by reference. And some Ada compilers might even use pass by
register.

This might sound strange to a C, C++ or C# programmer. Like giving up
control. There are things humans can do better then computers but there are
also things computers can do better then humans - and counting is is among
those. The compiler knows much better how many registers are available, how
large the type is, how long it takes to copy and so on.

You say what you need (in, out, in out) and the compiler will choose the
optimal way to fullfill you which. 

> A 2nd part to my question is: Does Ada automatically pass tagged types
> by reference no matter what mode the parameter is specfied (in, in
> out, or out)? The language RM 6.2 seems to suggest this is so. If so,
> does this mean that there is no way to pass a tagged type by value? I
> believe C# works this way without programmer intervention.

They are in deed allways passed by reference. That's done to enable
dispaching. Rermember: all native procedures of a tagged type are "virtual".

Two ways around that behavior:

1st: for any tagged type X there is indefinite type X'Class. X'Class is an
indefinite but untagged type so RM 6.2 does not apply here. 

2nt: RM 6.2 does not apply to a non native procedure. That is a procedure 
in another package.

With Regards

Martin

-- 
mailto://krischik@users.sourceforge.net
http://www.ada.krischik.com




  reply	other threads:[~2004-04-08 18:21 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-04-08 14:52 Pass by reference Dan McLeran
2004-04-08 18:21 ` Martin Krischik [this message]
2004-04-09 12:53   ` Dan McLeran
2004-04-13 12:42     ` Martin Krischik
2004-04-08 19:04 ` Jim Rogers
2004-04-09  3:24   ` Dan McLeran
2004-04-09  0:01 ` Stephen Leake
2004-04-09 12:38   ` Dan McLeran
2004-04-09 13:03     ` Dmitry A. Kazakov
2004-04-09 19:09       ` Dan McLeran
2004-04-10 10:49         ` Dmitry A. Kazakov
2004-04-11 12:43       ` Florian Weimer
2004-04-12 10:29         ` Dmitry A. Kazakov
2004-04-12 12:29           ` Samuel Tardieu
2004-04-13  8:46             ` Dmitry A. Kazakov
2004-04-10  1:42     ` Stephen Leake
2004-04-10 16:05       ` chris
2004-04-09 12:44   ` Dan McLeran
2004-04-09 22:44     ` Randy Brukardt
2004-04-09 14:44   ` Simon Wright
2004-04-09  1:15 ` Jeffrey Carter
2004-04-09  1:28   ` Pat Rogers
2004-04-10  1:05     ` Jeffrey Carter
2004-04-09 12:57   ` Dan McLeran
2004-04-10  1:16     ` Jeffrey Carter
2004-04-09  4:03 ` Steve
2004-04-09 14:50   ` Simon Wright
2004-04-09 17:12     ` Pat Rogers
2004-04-09 19:33       ` Vinzent 'Gadget' Hoefler
2004-04-10  6:33         ` Simon Wright
2004-04-13 10:26           ` Vinzent 'Gadget' Hoefler
2004-04-14 17:27             ` Simon Wright
2004-04-15  9:43               ` Vinzent 'Gadget' Hoefler
2004-04-17  7:59                 ` Simon Wright
2004-04-11 12:45   ` Florian Weimer
replies disabled

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