From: "DuckE" <nospam_steved94@home.com>
Subject: Re: Interface to C; Storage_Error
Date: Thu, 21 Dec 2000 03:25:41 GMT
Date: 2000-12-21T03:25:41+00:00 [thread overview]
Message-ID: <VKe06.176137$U46.5519033@news1.sttls1.wa.home.com> (raw)
In-Reply-To: 91ondg$lpu$1@nnrp1.deja.com
Here's my semi-educated "guess" at the interface to this function:
package C renames Interfaces.C;
subtype Srv_Handle is C.Unsigned_Long; -- Assumes type for
"Handle" is Unsigned_Long
type Ctx_Handle is access all C.Unsigned_Long; -- Assumes type for
"Ctx_Handle" is Unsigned_Long
subtype Flt_Handle is C.C_Float; -- Assumes type for
"Flt_Handle"
function GetNextVal( srv : access Srv_Handle;
rslt : access Srv_Handle;
ctx : access Ctx_Handle;
name : C.Char_Array;
dbl : access C.Double;
flt : access Flt_Handle ) return C.Int;
pragma Import( C, GetNextVal );
Since the "C" prototype is using "char *" I suspect you need to allocate the
data to send to the
function. I suspect a call would look something like:
-- (untested)
srv : aliased Srv_Handle;
rslt : aliased Srv_Handle;
ctx : aliased Ctx_Handle;
name : C.Char_Array := C.To_C( "Name" );
dbl : aliased C.Double;
flt : aliased Flt_Handle;
result : C.Int;
begin
result := GetNextVal( srv => srv'access,
rslt => rslt'access,
ctx => ctx'access,
name => name,
dbl => dbl'access,
flt => flt'access );
In my experience there is often more than one choice of how to interface to
C code. I usually
stay away from System.Addres, although it is certainly valid to use, I
prefer to avoid it.
BTW: It was a challenge to interface to the RSLinx 'C' SDK, but I eventually
made my way
through it.
Also... beware of callbacks. I'm not sure if GNAT behaves the same, but
with ObjectAda
if you are inside of a callback from a "C" library and you attempt to
perform an Ada tasking
operation (ie: Rendevous or Protected Operation) bad things happen.
Apparently the
Ada run time library (RTL) keeps additional task control block (TCB)
information for
Ada tasks.
In these cases I have resorted to using OS primatives for implmented my
own rendevous.
I hope this helps,
SteveD
"Chris" <enderx12@my-deja.com> wrote in message
news:91ondg$lpu$1@nnrp1.deja.com...
> Hi, all... after a long hiatus in the C++ world, I'm finally getting a
> chance to do some more Ada work, at my own suggestion. The ability to
> write production-quality multithread code an order of magnitude faster
> in Ada might have something to do with it.
>
> Anyway, I'm having an irritating problem interfacing with a vendor C
> library. The relevant stuff:
>
> typedef void* SRV_HANDLE;
> typedef void* CTX_HANDLE;
> typedef void* RSLT_HANDLE;
> typedef void* FLT_HANDLE;
>
> int GetNextVal(SRV_HANDLE srv, RSLT_HANDLE rslt, CTX_HANDLE *ctx,
> char* name, double* dbl, FLT_HANDLE flt);
>
> My take on it in Ada (GNAT 3.13p) is:
>
> type Srv_Handle is new System.Address;
> -- same for the other handles
>
> procedure GetNextVal(Ret : out int;
> Srv : Srv_Handle;
> Rslt : Rslt_Handle;
> Ctx : access Ctx_Handle;
> Name : out chars_ptr;
> Dbl : access double;
> Flt : Flt_Handle);
> pragma Import(C, GetNextVal);
> pragma Import_Valued_Procedure(GetNextVal);
>
> Both Name and Dbl are supposedly set/alloc'd by the library. When I
> call this, it raises Storage_Error on the library call. I am totally
> stumped as to what to fix, or even where to look. Is my Ada declaration
> even remotely correct?
> Other suggestions?
>
>
> Many thanks.
>
> --chris
>
>
> Sent via Deja.com
> http://www.deja.com/
next prev parent reply other threads:[~2000-12-21 3:25 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-12-19 22:28 Interface to C; Storage_Error Chris
2000-12-20 3:52 ` Ted Dennison
2000-12-20 8:55 ` Robert Dewar
2000-12-20 11:39 ` Thomas Wolf
2000-12-20 17:05 ` Chris
2000-12-20 23:57 ` Chris
2000-12-21 15:35 ` Thomas Wolf
2000-12-21 18:07 ` Chris
2000-12-21 3:25 ` DuckE [this message]
2000-12-21 11:38 ` Robert Dewar
2000-12-23 2:45 ` DuckE
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox