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=-0.9 required=5.0 tests=BAYES_00,FORGED_GMAIL_RCVD, FREEMAIL_FROM autolearn=no autolearn_force=no version=3.4.4 X-Google-Thread: 103376,7661856b1d8dc0ab X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit Path: g2news2.google.com!postnews.google.com!a75g2000cwd.googlegroups.com!not-for-mail From: "hannibal.holm@gmail.com" Newsgroups: comp.lang.ada Subject: Re: Calling Ada from C Date: 27 Feb 2007 04:49:22 -0800 Organization: http://groups.google.com Message-ID: <1172580562.037493.251070@a75g2000cwd.googlegroups.com> References: <1172159208.098190.143360@t69g2000cwt.googlegroups.com> NNTP-Posting-Host: 192.171.1.126 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-Trace: posting.google.com 1172580569 3873 127.0.0.1 (27 Feb 2007 12:49:29 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Tue, 27 Feb 2007 12:49:29 +0000 (UTC) In-Reply-To: User-Agent: G2/1.0 X-HTTP-UserAgent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.10) Gecko/20070216 Firefox/1.5.0.10,gzip(gfe),gzip(gfe) Complaints-To: groups-abuse@google.com Injection-Info: a75g2000cwd.googlegroups.com; posting-host=192.171.1.126; posting-account=JXgfzQ0AAADUkl9D_z4TRkiYQyMbku2z Xref: g2news2.google.com comp.lang.ada:9570 Date: 2007-02-27T04:49:22-08:00 List-Id: On Feb 23, 2:53 pm, Stephen Leake wrote: > "hannibal.h...@gmail.com" writes: > > I have a slight problem trying to call an Ada function from a C > > function. I need to pass in an unconstrained array to the Ada > > function. The problem is how I specify the size. > > Since the concept "unconstrained array" doesn't exist in C, this can't > possibly be a precise description of what you are doing. > > Can you give more context, and an example of the code? Especially the > C declarations of the data structure you are passing to Ada. > > -- > -- Stephe 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; 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); begin ... end Some_Ada_Proc; This is called with: char foo[] = {0xde, 0xad, 0xbe, 0xef}; some_ada_proc(foo, sizeof(foo)); // sizeof static array = 4 But that result in a crash which I assume is due to how Ada treats arrays passed as arguments. I would be very greatful for any help, and an explanation on what is actually going on in the Ada runtime system, e.g. descriptions on how the Ada ABI works in this case. Preferably I would like to do a toll free conversion from the C- pointer to the Ada array, is this possible?