comp.lang.ada
 help / color / mirror / Atom feed
From: "Warren W. Gay VE3WWG" <ve3wwg@cogeco.ca>
Subject: Re: Importing C structs?
Date: Thu, 31 Jul 2003 13:14:22 -0400
Date: 2003-07-31T13:14:22-04:00	[thread overview]
Message-ID: <J7cWa.1385$qN3.186969@news20.bellglobal.com> (raw)
In-Reply-To: <ddWVa.1313$Kx1.14581@newsfep4-glfd.server.ntli.net>

chris wrote:

> Freejack wrote:
> 
>> I'm finally starting to get an idea(at least I think I am.) on handling
>> interfacing to C.
> 
> Really?  I don't think I'll ever get the hang of it.

Depending upon the mandates that you're working with
for your project(s), I'll offer this general advice
when interfacing to C facilities:

For complex interactions, like those that involve C
structures, it is sometimes much quicker and reliable
(in the portability sense) to build a layer of C
between the two environments (C wrapper routines).

This helps in several ways:

  - C macros are easily tested and handled
  - sizeof(type) differences are more easily
    addressed (or identified when out of bounds)
  - difficult C structures can be mapped to Ada
    arguments that are more easily handled.
  - C preprocessor work can make the wrapper
    more platform agnostic without affecting
    Ada code changes.
  - Permits more flexibility on the Ada side,
    WRT to records (tagged or controlled etc.)

If OTOH, you must have "as much Ada as possible", or the
ultimate in efficiency, then you'll have more work cut
out for you, at least in the more difficult C/C++ cases.

WRT to C structures and portability, what you may find
is that all your effort will be trashed on another
platform where they have defined some members slightly
differently (different sizes, pad members, different
alignment rules and filling/packing, different order
etc.)  So, if this is a concern, a wrapper is much
safer in the portability sense.

...
> This is from my ongoing work on a libjpeg binding...
> 
>    type Jpeg_Error_Mgr is record
>       Error_Exit          : Error_Exit_Handler;
>       Emit_Message        : Emit_Message_Handler;
>       Output_Message      : Output_Message_Handler;
>       Format_Message      : Format_Message_Handler;
>       Reset_Error_Mgr     : Reset_Error_Handler;
>       Msg_Code            : C.Int;
>       Msg_Parm            : System.Address;
>       Trace_Level         : C.Int;
>       Num_Warnings        : C.Long;
>       Jpeg_Message_Table  : Jpeg_Message_TableT;
>       Last_Jpeg_Message   : C.Int;
>       Addon_Message_Table : Jpeg_Message_TableT;
>       First_Addon_Message : C.Int;
>       Last_Addon_Message  : C.Int;
>    end record;
> 
>    pragma Convention (C, Jpeg_Error_Mgr);

-- 
Warren W. Gay VE3WWG
http://home.cogeco.ca/~ve3wwg




  parent reply	other threads:[~2003-07-31 17:14 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2003-07-30 20:03 Importing C structs? Freejack
2003-07-30 20:52 ` chris
2003-07-30 21:26   ` Freejack
2003-07-30 23:50   ` tmoran
2003-07-31 10:53     ` chris
2003-08-04 14:33     ` Andreas Almroth
2003-08-04 15:16       ` Samuel Tardieu
2003-08-04 20:07         ` Randy Brukardt
2003-07-31 17:14   ` Warren W. Gay VE3WWG [this message]
2003-08-12  0:02     ` chris
2003-07-31 18:17   ` Xenos
2003-07-31 19:16     ` Simon Wright
2003-07-31 20:17       ` Samuel Tardieu
2003-07-31 20:40       ` Xenos
2003-07-30 23:14 ` Ching Bon Lam
2003-07-31  0:07   ` tmoran
2003-07-31  5:35   ` Matthew Heaney
2003-07-31  7:46     ` Freejack
2003-07-31  9:27       ` Martin Dowie
2003-07-31 21:41         ` Freejack
2003-08-01  7:39           ` Martin Dowie
2003-07-31 17:34       ` Matthew Heaney
2003-07-31 11:29     ` Ching Bon Lam
2003-07-31 16:59       ` Matthew Heaney
2003-07-31 17:32         ` Warren W. Gay VE3WWG
2003-07-31 17:13       ` Matthew Heaney
2003-07-31 17:40       ` Randy Brukardt
2003-07-31  5:21 ` Matthew Heaney
replies disabled

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