Dynamic libraries

View: New views
2 Messages — Rating Filter:   Alert me  

Dynamic libraries

by robin cowan :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


I am trying to write a dynamic linked library for R, in Pascal. (This  
is to speed up the execution of a simulation that I am running in R.)  
I know Pascal might not be the perfect language for this (C or Fortran  
being more natural), but from what I have read I think it should  
work.  Though I should point out that I am a neophyte when it comes to  
DLLs.

 From R I want to hand a function in the library a two-dimensional  
matrix, operate on the matrix, and hand back a 2-d matrix.

I have no problem creating the library and loading it using dyn.load()

I have written an R wrapper for the function.

When I do something simple using scalars (integers) everything works  
fine, or so it seems at least.
However, when I try to use a vector as an argument to the function,  
two things happen:
R becomes very unstable;
the function only operates on the first 3 elements of the vector (say  
if the vector has 5 elements).

Anyone have experience with this sort of thing?

Thanks,
Robin Cowan

Sample below:

This one works fine:

library Test1Lib;

type
pA=^integer;

procedure simple(x:pA); cdecl;
var i1,i2:integer;

begin
        x^:=x^*2;
end;

exports  simple;
begin
end.


This one does not:

library Test2Lib;

type
array1=array[1..5] of integer;
pA=^array1;
procedure simpleArray(x:pA); cdecl;
var i1:integer;

begin
for i1:=1 to 5 do
        x^[i1]:=x^[i1]*2;
end;

exports  simpleArray;
begin
end.


Here is the wrapper I use:
MySimple <- function(x)
{
   ans <- .C("simple",as.integer(x)) # or simpleArray in the second case
   ans[[1]]
   }

Here is what I get:

 > x<-c(1,2,3,4,5)
 > MySimple(x)
[1] 2 4 6 4 5




The University of Maastricht has changed its name and mail servers. My  
email address is now r.cowan@....






        [[alternative HTML version deleted]]

______________________________________________
R-devel@... mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Re: Dynamic libraries

by Duncan Murdoch-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

On 03/07/2009 4:37 PM, robin cowan wrote:
> I am trying to write a dynamic linked library for R, in Pascal.

You need to tell us what Pascal compiler you're using.  You may need to
ask your compiler provider how to compile something to interface with R,
or tell us all sorts of details that you may not know.  Such as:

  - what is "integer"?
  - what is "cdecl"?

Those have obvious answers; but it really depends on your compiler
writer to implement them in the obvious way or some other.  And then
there's:

- what registers does your compiler preserve across calls?

That's usually much harder to discover, but really crucial for stable
performance of the caller.

Duncan Murdoch


  (This

> is to speed up the execution of a simulation that I am running in R.)  
> I know Pascal might not be the perfect language for this (C or Fortran  
> being more natural), but from what I have read I think it should  
> work.  Though I should point out that I am a neophyte when it comes to  
> DLLs.
>
>  From R I want to hand a function in the library a two-dimensional  
> matrix, operate on the matrix, and hand back a 2-d matrix.
>
> I have no problem creating the library and loading it using dyn.load()
>
> I have written an R wrapper for the function.
>
> When I do something simple using scalars (integers) everything works  
> fine, or so it seems at least.
> However, when I try to use a vector as an argument to the function,  
> two things happen:
> R becomes very unstable;
> the function only operates on the first 3 elements of the vector (say  
> if the vector has 5 elements).
>
> Anyone have experience with this sort of thing?
>
> Thanks,
> Robin Cowan
>
> Sample below:
>
> This one works fine:
>
> library Test1Lib;
>
> type
> pA=^integer;
>
> procedure simple(x:pA); cdecl;
> var i1,i2:integer;
>
> begin
> x^:=x^*2;
> end;
>
> exports  simple;
> begin
> end.
>
>
> This one does not:
>
> library Test2Lib;
>
> type
> array1=array[1..5] of integer;
> pA=^array1;
> procedure simpleArray(x:pA); cdecl;
> var i1:integer;
>
> begin
> for i1:=1 to 5 do
> x^[i1]:=x^[i1]*2;
> end;
>
> exports  simpleArray;
> begin
> end.
>
>
> Here is the wrapper I use:
> MySimple <- function(x)
> {
>    ans <- .C("simple",as.integer(x)) # or simpleArray in the second case
>    ans[[1]]
>    }
>
> Here is what I get:
>
>  > x<-c(1,2,3,4,5)
>  > MySimple(x)
> [1] 2 4 6 4 5
>
>
>
> The University of Maastricht has changed its name and mail servers. My  
> email address is now r.cowan@....
>
>
>
>
>
>
> [[alternative HTML version deleted]]
>
> ______________________________________________
> R-devel@... mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@... mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel