Hello Dirk
That was exactly the trick! Thanks a lot! Our class and code work so far, but
it may take more time to debug or find bad design. Perhaps we will be back with
more detailed questions. Anyway, one question already emerged. When librarying
the class, assigning an object, do some calculations, whatever -- everything
goes fine. Yet, when using R CMD BATCH on a file listing the same commands as
by hand, R produces some nice information at the end, however, here it produces
an segmentation fault, which does -- according to my small knowledge -- say
something bad:
> proc.time()
user system elapsed
0.702 0.017 0.714
R(72992) malloc: *** error for object 0x2c9b604: incorrect checksum for freed
object - object was probably modified after being freed.
*** set a breakpoint in malloc_error_break to debug
*** caught segfault ***
address 0x4909d58, cause 'memory not mapped'
Traceback:
1: save(list = ls(envir = .GlobalEnv, all.names = TRUE), file = outfile,
version = version, ascii = ascii, compress = compress, envir = .GlobalEnv,
precheck = FALSE)
2: save.image(name)
3: sys.save.image(".RData")
aborting ...
Any idea what goes wrong there?
Regards
Sören + Carlo
On 14.05.2011, at 18:17, Dirk Eddelbuettel wrote:
Soeren,
On 13 May 2011 at 20:07, [email protected] wrote:
| Compilation with R CMD CHECK FOO fails with the following error in
00install.out:
|
| Error in dyn.load(file, DLLpath = DLLpath, ...) :
| unable to load shared object
'/Users/sovo/GUTS/FOO.Rcheck/FOO/libs/i386/FOO.so':
| dlopen(/Users/sovo/GUTS/FOO.Rcheck/FOO/libs/i386/FOO.so, 6): Symbol not
found: __ZN3FOOC1Ev
| Referenced from: /Users/sovo/GUTS/FOO.Rcheck/FOO/libs/i386/FOO.so
| Expected in: flat namespace
|
| The (original) class and its functions compile fine with R CMD SHLIB. So we
guess that this error has something to do with the Rcpp modules implementation.
It took me a few minutes with trial and error, but essentially the mistake
seems to have been this:
| > | FOO();
| > | ~FOO();
You declared the constructor and deconstructor but there was no code
anywhere. A pair of empty braces ' {}; ' is all it takes.
In the process, I renamed things from 'foo' (just to be plain) to 'Baz'. So
the file is now
-----------------------------------------------------------------------------
// baz_module.cpp
#include <Rcpp.h>
// from Baz.h
class Baz
{
private:
double dtau;
std::vector<double> D, ee, ff, S;
public:
int M;
std::vector<double> C, t, s, par;
std::vector<int> y;
Baz() {};
~Baz() {};
double do_bar(std::vector<double> z);
};
// from Baz.cpp
double Baz::do_bar(std::vector<double> z) {
// whatever it does
return 42.0; // need to return something here
}
RCPP_MODULE(baz){
using namespace Rcpp ;
class_<Baz>( "Baz" )
.constructor()
.field( "M" , &Baz::M )
.field( "C" , &Baz::C )
.method( "do_bar", &Baz::do_bar )
;
}
-----------------------------------------------------------------------------
and with the line
RcppModules: yada, baz
we get this module loaded:
R> library(mypackage)
R> Baz
C++ class 'Baz' <0x1c37db0>
Constructors:
Baz()
Fields:
std::vector<double, std::allocator<double> > C
int M
Methods:
double do_bar(std::vector<double, std::allocator<double> >)
R>
R> bb <- new(Baz)
R> bb
C++ object <0x18c8f90> of class 'Baz' <0x1c37db0>
R> bb$M <- 12
R> print(bb$M)
[1] 12
R> print(bb$C)
numeric(0)
R> bb$C <- seq(1.1, 5.5, by=1.1)
R> bb$C
[1] 1.1 2.2 3.3 4.4 5.5
R> R> print(bb$do_bar(1:4))
[1] 42
R>
I hope you can take it from here.
Cheers, Dirk
--
Gauss once played himself in a zero-sum game and won $50.
-- #11 at http://www.gaussfacts.com
_______________________________________________
Rcpp-devel mailing list
[email protected]
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel