comp.lang.ada
 help / color / mirror / Atom feed
From: "Jeffrey R. Carter" <jrcarter@acm.org>
Subject: Re: Calling Ada from C
Date: Wed, 28 Feb 2007 02:54:57 GMT
Date: 2007-02-28T02:54:57+00:00	[thread overview]
Message-ID: <5a6Fh.19316$PD2.1313@attbi_s22> (raw)
In-Reply-To: <1172580562.037493.251070@a75g2000cwd.googlegroups.com>

hannibal.holm@gmail.com wrote:
> 
> The data structure in C is just a pointer to a block of data to be
> sent over a network link. This need to be converted to a byte array
> defined as:
> 
> Byte_Size   : constant := 8;
> 
> type Byte is range 0 .. 2**Byte_Size - 1;
> for Byte'Size use Byte_Size;

Anything you use to talk to C should be convention C. Since, from below, 
in C this seems to be char, you should use Interfaces.C.Char and 
Interfaces.C.Char_Array. Since Char_Array is convention C, Ada won't 
expect it to have bounds associated with it.

> 
> type Byte_Array is array (Natural range <>) of Byte;
> pragma Pack (Byte_Array);
> 
> As said, I am not extremly familiar with Ada and come from a C-
> background, so I have a few problems trying to figure out what the ada
> runtime and type system actually does. I tried something like
> 
> -- This proc is exported as with C-conventions
> procedure Some_Ada_Proc(Msg : in Byte_Array;
>                         Len : in Natural) is
>   Msg_Constr : Byte_Array := Msg(0 .. Length - 1);

Again, you should use Interfaces.C.Int instead of Natural.

Where does Length come from?

> This is called with:
> 
> char foo[] = {0xde, 0xad, 0xbe, 0xef};
> some_ada_proc(foo, sizeof(foo)); // sizeof static array = 4

This is where I get char from above.

If using Char_Array still crashes, you can use a very large constrained 
subtype of Char_Array:

subtype Many_Chars is Interfaces.C.Char_Array (Interfaces.C.Size_T);

and slice the result with 0 .. Interfaces.C.Size_T (Len). This can then 
be converted into your array of Bytes.

-- 
Jeff Carter
"I would never want to belong to any club that
would have someone like me for a member."
Annie Hall
41



  parent reply	other threads:[~2007-02-28  2:54 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-22 15:46 Calling Ada from C hannibal.holm
2007-02-22 16:17 ` Ludovic Brenta
2007-02-22 17:28 ` Adam Beneschan
2007-02-22 20:40 ` Aurele
2007-02-23 13:53 ` Stephen Leake
2007-02-27 12:49   ` hannibal.holm
2007-02-27 18:03     ` Adam Beneschan
2007-02-28  2:54     ` Jeffrey R. Carter [this message]
  -- strict thread matches above, loose matches on Subject: below --
2000-08-25  0:00 Maxwelton
1996-10-29  0:00 How is an ADA compiler done? Robert Dewar
1996-11-08  0:00 ` calling ADA from C EDSTAM Mikael
1996-11-14  0:00   ` Robert Dewar
1995-03-22 13:26 Calling Ada " Roger L Costello
1995-03-22 13:58 ` David Paton
1995-03-23 17:22 ` Theodore Dennison
1995-03-24 17:14   ` Larry Kilgallen, LJK Software
1995-03-26 11:53     ` Robert Dewar
1995-03-27 14:47       ` Theodore Dennison
1995-03-28  0:00         ` Robert Dewar
1995-03-28  0:00         ` Cyrille Comar
1995-03-29  2:47         ` Larry Kilgallen, LJK Software
1995-03-29  0:00           ` Theodore Dennison
1995-04-04  0:00             ` Robert Dewar
1995-03-27 19:48     ` Robert I. Eachus
1995-03-29  0:00       ` Larry Kilgallen, LJK Software
1991-02-23 16:01 calling " David B Lightstone
1988-10-16  0:23 calling ada from c Maureen Cragg
1988-10-17 17:21 ` Maureen Cragg
replies disabled

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