From jelkink at gmail.com  Wed Apr  4 19:44:03 2007
From: jelkink at gmail.com (Jos Elkink)
Date: Wed, 4 Apr 2007 13:44:03 -0400
Subject: [Rd] Accessing C++ code from R
Message-ID: <cc06ac9d0704041044l273113ecn5c6d6153ba3cfbeb@mail.gmail.com>

Hi,

I am trying to use existing C++ code from R. I have no problems
compiling C code and using it in R, but with C++ I'm running into
problems.

Here's the compiler output:

Macintosh-10:~/Desktop/dissertation/Model - CPP version/R labguest$
g++ -I/Library/Frameworks/R.framework/Resources/include
-I/Library/Frameworks/R.framework/Resources/include/i386 *.cpp
In file included from /usr/include/c++/4.0.0/bits/locale_facets.h:1533,
                 from /usr/include/c++/4.0.0/bits/basic_ios.h:44,
                 from /usr/include/c++/4.0.0/ios:50,
                 from /usr/include/c++/4.0.0/ostream:44,
                 from /usr/include/c++/4.0.0/iostream:44,
                 from main.cpp:5:
/usr/include/c++/4.0.0/bits/codecvt.h:217:45: error: macro "length"
passed 4 arguments, but takes just 1
/usr/include/c++/4.0.0/bits/codecvt.h:216: error: expected ';' before 'const'
/usr/include/c++/4.0.0/bits/codecvt.h:220: error: expected `;' before 'int'
main.cpp:51: error: brace-enclosed initializer used to initialize
'R_NativePrimitiveArgType*'


Line 51 refers to the standard part to register the function in R:

R_CMethodDef cMethods[] = {
  {"runSimulation", (void* (*) ()) &runSimulation, 27, {INTSXP,
INTSXP, INTSXP, REALSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP,
INTSXP, INTSXP, INTSXP, REALSXP, REALSXP, INTSXP, INTSXP, INTSXP,
INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, INTSXP, REALSXP,
REALSXP, REALSXP}},
  {NULL, NULL, 0}
};


I had to add the explicit cast of &runSimulation to get rid of one
compiler error, but do not know how to deal with this one.
Encapsulating this part of the code in

extern "C" {
}

has no effect.

runSimulation is just a regular function, with a lot of int* and
double* parameters, and it is not part of a class. It does inside
create a class, though.

Outline:

void runSimulation(int *p_1 ... etc) {

   try {
     CModel Model();
     Model.Run();
   } catch (CException& e) {
     cout << "exception" << endl;
   }
}

Encapsulating this function in extern "C" also has no effect.

Anyone any ideas what I should do? The system I am using is an Intel-based Mac.

Thanks in advance!

Jos



[Rd] Accessing C++ code from R
Jos Elkink