From Roger.Bivand at nhh.no  Mon Mar 13 21:01:16 2006
From: Roger.Bivand at nhh.no (Roger Bivand)
Date: Mon, 13 Mar 2006 21:01:16 +0100 (CET)
Subject: [Rd] Help on interfacing C++ with R
In-Reply-To: <OFF3325189.3431239E-ON88257130.00694BA6-88257130.006C2551@epamail.epa.gov>
Message-ID: <Pine.LNX.4.44.0603132050340.5897-100000@reclus.nhh.no>

On Mon, 13 Mar 2006 Sun.Bing at epamail.epa.gov wrote:

> Hi, I am trying to set up a C++ library for my R code. I followed the 
> R-extension manual but found out that the example of "X.cpp, X_main.cpp" 
> is somewhat too simple. Here is my code:

Simpler is easier, all this std stuff gets in the way. The problem is that 
R is passing pointers (probably) to doubles, not simple integers. As far 
as I can see, you need to change the 

.C("testIntDivision", 4, 2);

to make sure your numbers are integers (as.integer()) is OK), and the 
function itself (provided that it is visible, and I've no idea if this is 
the case, to pointer arguments:

int testIntDivision(int&, int&); // untried

then pick out the integer values at those addresses. It'll be one or both 
of these problems (I am not fluent in C++, but the same principles apply 
to C). 

I would be concerned about exporting any competing main to load 
dynamically into R too, could you compile the code in two files, one the 
code to load into R, the other with main calling your code, and *only* 
load what needs to be inside R?

> 
>  //lib4R.h testing for interfacing C++ with R -- using C++ library in R
> #include <iostream>
> using namespace std;
> 
> class lib4R {
> public:
>         lib4R();
>         ~lib4R();
> 
>         int testIntDivision(int, int);
>         double testDoubleMultiplication(double, double);
> 
>         int getID();
>         void setID(int);
> private:
>         int ID;
> };
> 
> // lib4R.cpp : Defines the entry points for the library.
> #include "lib4R.h"
> 
> lib4R::lib4R() {
>         cout << "Constructor lib4R()" << endl;
> }
> 
> lib4R::~lib4R() {
>         cout << "Destructor ~lib4R()" << endl;
> }
> 
> extern "C" {
> 
> int lib4R::testIntDivision(int a, int b) {
>       return a/b;
> }
> 
> double lib4R::testDoubleMultiplication(double a, double b) {
>         return a*b;
> }
> 
> int lib4R::getID() {
>         return this->ID;
> }
> 
> void lib4R::setID(int ID) {
>         this->ID = ID;
> }
> 
> int main(int argc, char* argv[])
> {
>         cout << "Entering main()" << endl;
>         lib4R lib1;
> 
>         cout << "testIntDivision(4,2) = " << lib1.testIntDivision(4,2) << 
> endl;
> 
>         return 0;
> }
> 
> } // extern C
> 
> I am working on Windows. I use these to compile the dll with Visual C++:
> 
> cl /MT /c lib4R.cpp
> link /dll /out:lib4R.dll /export:testIntDivision /export:main lib4R.obj
> 
> So when I start rterm.exe:
> 
> >dyn.load("../lib4R.dll");
> >.C("main");
> Entering main()
> Constructor lib4R()
> testIntDivision(4,2) = 2
> Destructor ~lib4$()
> list()
> 
> The output is correct, but if I
> >.C("testIntDivision", 4, 2);
> 
> it generated the dialog box claiming "R has encountered a problem and 
> needs to be closed.......Please tell Microsoft about this problem....", 
> sigh.
> 
> So what's wrong with my code, how do I use individual methods/functions of 
> C++ in R?
> 
> Thanks in advance for any help you can offer!
> 
> Bing
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
> 

-- 
Roger Bivand
Economic Geography Section, Department of Economics, Norwegian School of
Economics and Business Administration, Helleveien 30, N-5045 Bergen,
Norway. voice: +47 55 95 93 55; fax +47 55 95 95 43
e-mail: Roger.Bivand at nhh.no



[Rd] Help on interfacing C++ with R
Roger Bivand