[Openmcl-devel] Calling foreign function with float array as argument?

Ronnie Hoogerwerf ronnieh at head-cfa.harvard.edu
Thu Nov 21 08:08:26 PST 2002


Hi,

I relatively new to openmcl but have some experience using mcl and cmucl.
I am trying to port a lisp interface to the PGPLOT graphics library to
openmcl (the orignal was written for cmucl) and am running into some
problems that I cannot seem to solve. I need to pass an array (of type 
single-float) to a foreign function. This function then changes the values
of the array and I would like to retrieve those changed values. 
An example of the c-code looks something like:


/****************************************/
#include "cpgplot.h"
#include <string.h>
extern int pgcurs_();

int cpgcurs(float *x, float *y, char *ch_scalar)
{
  int len_ch_scalar = 1;
  int r_value;
  r_value = pgcurs_(x, y, ch_scalar, len_ch_scalar);
  return r_value;
}
/****************************************/

The cmucl code solves the problem of passing pointers to float by 
obtaining the memory address of the lisp array (using
kernel:get-lisp-obj-address) and then passes the address to the function.

I am at a loss on how I do this in openmcl. So my questions are:

1) How do I call the foreign function?
   a) (ccl::external-call "_cpgcurs"
		          (:* float) x
		          (:* float) y
	     	          (:* char) c
		          :int)
   b) (ccl::external-call "_cpgcurs"
		          :address x
		          :address y
	     	          :address c
		          :int)

2) How do I obtain the memory address (or macptr) of a lisp object?
   Or is there some other way around this?

I am using openmcl 0.13 on Mac OS X 10.1.5.

I hope I make myself clean and I would appreciate any help.

Thanks,
Ronnie


P.S. I succeeded in calling a foreign function which had just a single
     float as its argument (not an array) but was unable to modify this
     to work with an array of floats:

(defun func (x)
  (rlet ((_x :float))
    (setf (pref _x :float) x)
    (ccl::external-call "_func"
  			(:* float) _x)
    (pref _x :float)))
 





_______________________________________________
Openmcl-devel mailing list
Openmcl-devel at clozure.com
http://clozure.com/cgi-bin/mailman/listinfo/openmcl-devel



More information about the Openmcl-devel mailing list