An embedded and charset-unspecified text was scrubbed... Name: not available Url: https://stat.ethz.ch/pipermail/r-devel/attachments/20060313/5ec90fde/attachment.pl
Help on interfacing C++ with R
2 messages · Sun.Bing@epamail.epa.gov, Roger Bivand
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