Re: [Rcpp-devel] Segfault in wrapping code in Rcpp

2024-03-02 Thread Dirk Eddelbuettel


Hi Nikhil,

Don't post images. I read in a text-based reader. The mailing list software
also scrubs html (I think).

I would simplify. Start with the simplest Rcpp Modules setup. Then add. Check
checking. Eventually on your way towards what you are doing now you may spot
the error.

Hope this helps,  Dirk

-- 
dirk.eddelbuettel.com | @eddelbuettel | e...@debian.org
___
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


[Rcpp-devel] Segfault in wrapping code in Rcpp

2024-03-01 Thread Nikhil Garg
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 RasterBaseRef;
typedef std::vector RasterBaseRefs;

RasterBaseFloat *newRasterBase() {
return new RasterFloat();
}

void sortColumns(RasterFloat& r) {
Geostack::sortColumns(r);
}

RasterBaseFloat& get_raster_ref_from_vec(RasterBaseRefs ,
std::size_t i)
{
return v[i].get();
}

void add_ref_to_vec(RasterBaseRefs , RasterBaseFloat )
{
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")
.constructor("Instantiate property map object")

class_("RasterBase")
.derives("PropertyMap")
.factory()

class_("Raster")
.derives("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