Hi, I am currently working on wrapping some code from a C++ library. I am using RCPP for this work. I have managed to get the wrapping code compiled but I get segfault when I try to use some of the functionality.
Here is an example of how I have gone about it, though I think I am quite sure I am missing something. Note, I have left out methods in the RCPP_MODULE wrappings. I am happy to share that if needed to get more information. In the code below, *RasterBase* is an abstract class that derives from *PropertyMap.* I have used Romain Francis's suggestion ( https://stackoverflow.com/questions/24317910/rcpp-module-for-inheritance-class?rq=3) on how to work with derived class and Ralf Stubner's suggestion ( https://stackoverflow.com/questions/54469409/how-to-expose-a-pointer-of-an-abstract-class-using-rcpp) on how to work with an abstract class and got most stuff working. typedef std::reference_wrapper<RasterBaseFloat> RasterBaseRef; typedef std::vector<RasterBaseRef> RasterBaseRefs; RasterBaseFloat *newRasterBase() { return new RasterFloat(); } void sortColumns(RasterFloat& r) { Geostack::sortColumns(r); } RasterBaseFloat& get_raster_ref_from_vec(RasterBaseRefs &v, std::size_t i) { return v[i].get(); } void add_ref_to_vec(RasterBaseRefs &v, RasterBaseFloat &rf) { v.emplace_back(std::ref(rf)); } void runScriptNoOut(std::string script, SEXP r_list, std::size_t param) { Rcpp::List raster_base_list(r_list); int n = raster_base_list.size(); RasterBaseRefs raster_list; raster_list.reserve(n); Rcpp::Rcout << raster_list.size() << std::endl; for (int i = 0; i < n; i++) { RasterFloat r = raster_base_list[i]; add_ref_to_vec(raster_list, r); } Rcpp::Rcout << raster_list.size() << std::endl; Geostack::runScriptNoOut(script, raster_list, param); } RCPP_MODULE(GS_Raster) { class_<PropertyMap>("PropertyMap") .constructor("Instantiate property map object") class_<RasterBaseFloat>("RasterBase") .derives<PropertyMap>("PropertyMap") .factory(&newRasterBase) class_<RasterFloat>("Raster") .derives<RasterBaseFloat>("RasterBase") Here is how I have tested the wrappings in R. library(devtools) setwd("/home/gar305/Documents/geostack/r_binding/RcppGeostack") devtools::load_all() library(Rcpp) testA <- new(Raster, "testRaster") testA$init(256, 256, 4, 0.0, 0.0, 0.0, 1.0, 1.0, 1.0) testA$setAllCellValues(0.0) testA$getCellValue(10, 10, 0) dims <- testA$getRasterDimensions() dims projParams <- fromEPSG("4326") testA$setProjectionParameters(projParams) proj2 <- testA$getProjectionParameters() proj2 testA$getProperty_String("name") r_list <- list(testA) runScriptNoOut("testRaster = randomNormal(0, 1);", r_list, 0) testA$getCellValue(10, 10, 0) and here is what I get when I run the above R code [image: image.png] Any help or suggestions on ways to rectify this issue would be great. Regards, Nikhil
_______________________________________________ Rcpp-devel mailing list Rcpp-devel@lists.r-forge.r-project.org https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel