gerhardt@AJPO.SEI.CMU.EDU (01/26/89)
We have tried to use the SAIC X window binding with the DEC ACS compiler. We are having problems with what looks like a bug in DEC ACS Ada. The code fragment looks like : type FOO is record... end record; type CLIST is access FOO; procedure EXT ( A : in out SYSTEM.ADDRESS ) is ... end; pragma INTERFACE (EXT, SYSTEM.ADDRESS, VALUE); LOC : CLIST; begin EXT(LOC.all.'ADDRESS); ... This code compiles but when it runs it loses the address when it gets to the externaL procedure (WRITTEN IN C). When an unchecked conversion to SYSTEM.ADDRESS is done on LOC and that is used as the calling parameter, it works ok. Am I missing something, or is this a plain old bug?? Thanks in advance MArk Gerhardt ESL, INC reply : gerhardt@ajpo.sei.cmu.edu
jb@rti.UUCP (Jeff Bartlett) (01/27/89)
In article <8901260051.AA26048@ajpo.sei.cmu.edu>, gerhardt@AJPO.SEI.CMU.EDU writes: > We have tried to use the SAIC X window binding with the DEC ACS > compiler. > We are having problems with what looks like a bug in DEC ACS Ada. > The code fragment looks like : > type FOO is record... end record; > type CLIST is access FOO; > procedure EXT ( A : in out SYSTEM.ADDRESS ) is ... end; > pragma INTERFACE (EXT, SYSTEM.ADDRESS, VALUE); > LOC : CLIST; > begin > EXT(LOC.all.'ADDRESS); > This code compiles but when it runs it loses the address when it gets > to the externaL procedure (WRITTEN IN C). > When an unchecked conversion to SYSTEM.ADDRESS is done on LOC and that > is used as the calling parameter, it works ok. Am I missing > something, or is this > a plain old bug?? Thanks in advance This works: -- zip.ada with SYSTEM; procedure ZIP is type FOO is record BAR : INTEGER; end record; type CLIST is access FOO; procedure EXT( A : SYSTEM.ADDRESS ); pragma interface(C,EXT); pragma import_procedure(EXT,"EXT",mechanism=>value); LOC : CLIST; begin LOC := new FOO; LOC.BAR := 5; EXT(LOC.all'address); end ZIP; -- ext.c struct foo { int bar; }; ext( p ) struct foo *p; { printf("p->bar = %d\n", p->bar ); } -- run.com $ acs create library [.adalib] $ acs set library [.adalib] $ ada zip $ cc ext $ acs export/main zip $ link zip,sys$input/option ext.obj sys$library:vaxcrtl/share $ run zip $ exit --------------- This was verified with DecAda v1.3. for more info see "VAX Ada Programmer's Run-Time Reference Manual", section 4.4 "Using the Import and Export Pragmas", pages 4-14 to 4-26. Hope this helps. Jeff Bartlett Center for Digital Systems Research jb@rti.rti.org Research Triangle Institute, RTP, NC rti!jb@mcnc mcnc!rti!jb > > MArk Gerhardt > ESL, INC > reply : gerhardt@ajpo.sei.cmu.edu