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

Reply via email to