Accessing C++ code from R
Hi Simon, Thank you - that indeed fixes the first problem (about cout). It still leaves the second error, though: main.cpp:52: error: brace-enclosed initializer used to initialize 'R_NativePrimitiveArgType*' Any ideas about that? Thanks again for the first suggestion, anyway, and I'll keep your point about cout in mind. Jos
On 4/4/07, Simon Urbanek <simon.urbanek at r-project.org> wrote:
Jos, you omitted the crucial part but my guess would be that all you have to do is to put #include <iostream> *before* R headers includes (R defines "length" which throws off iostream). Also note that using cout is not a good idea, because it is not captured by R, you should be using Rprintf instead. Cheers, Simon On Apr 4, 2007, at 1:44 PM, Jos Elkink wrote:
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
______________________________________________ R-devel at r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-devel
Jos Elkink PhD Candidate, Trinity College Dublin HMDC Fellow, Harvard University http://jaeweb.cantr.net