comp.lang.ada
 help / color / mirror / Atom feed
From: Ludovic Brenta <ludovic.brenta@insalien.org>
Subject: Re: Returning data from Ada to C
Date: Sun, 08 May 2005 16:55:38 +0200
Date: 2005-05-08T16:55:28+02:00	[thread overview]
Message-ID: <87is1thimt.fsf@insalien.org> (raw)
In-Reply-To: d5kmrs$sct$1@nwrdmz03.dmz.ncs.ea.ibs-infra.bt.com

Martin Dowie writes:
> wrote:
> [snip]
>> == hello.c =============================
>> #include <stdio.h>
>> void adainit();
>> void adafinal();
>> void hello_world(int *i, int **a_ptr);
>> int main()
>> {
>> 	int i = 1;
>> 	int *a_ptr;
>> 	printf ("Calling Ada...\n");
>> 	adainit();
>> 	hello_world(&i, &a_ptr);
>> 	printf ("...done\n");
>> 	printf ("Returned i = %d\n", i);
>> 	for (i=0; i<3; i++)
>> 		printf ("a_ptr[%d] = %d\n", i, a_ptr[i]);
>> 	adafinal();
>> 	return 0;
>> }
>> ========================================
>> What am I missing to make this work?
>
> Don't you have to allocate some memory for this array before passing
> it around?...
>
> Cheers
>
> -- Martin

If I understand the design correctly, Hello_World is supposed to do
the allocation, but from the previous post it looks like the
allocation takes place on the stack, and then Hello_World sets a_ptr
using 'Unchecked_Access.

The OP should rewrite Hello_World like this:

procedure Hello_World (I : in out Integer;
                       A_Ptr : out C_IntArrs.Pointer) is
   type Array_Access is access C_Integer_Arrays.C_Integer_Array;
   Result : Array_Access := new C_Integer_Arrays.C_Integer_Array'
          (0 => 3, 1 => 2, 2 => 1);
begin
   return Result (Result'First)'Access;
end Hello_World;

Beware that 

- main() must have some way of knowing the length of the array.

- main() must deallocate the array, preferably using an Ada procedure
  because the array was allocated using the Ada default storage pool.

Perhaps it is better indeed if main() allocates the memory for the
array and just passes it to Hello_World.

-- 
Ludovic Brenta.




  reply	other threads:[~2005-05-08 14:55 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-05-03 23:49 Returning data from Ada to C igor.kh
2005-05-04  4:49 ` Jeffrey Carter
2005-05-04 13:45   ` Igor Khavkine
2005-05-04 13:58     ` Alex R. Mosteo
2005-05-06  3:36     ` Jeffrey Carter
2005-05-07 22:12       ` igor.kh
2005-05-08  2:07         ` Jeffrey Carter
2005-05-08 19:58           ` Jeffrey Carter
2005-05-08  9:41         ` Martin Dowie
2005-05-08 14:55           ` Ludovic Brenta [this message]
2005-05-08 14:58             ` Ludovic Brenta
2005-05-09 22:49               ` igor.kh
2005-05-10 12:48                 ` Ludovic Brenta
2005-05-16  4:35   ` Dave Thompson
2005-05-16  5:03     ` Jeffrey Carter
replies disabled

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