I am tring to use Rcpp Module to export C++ class to R, but meet some problem.<div>Here is my code:</div><div>###########################################################################################</div><div>/* file PL modules.cpp */</div>
<div><div>using namespace Rcpp;</div><div>using namespace std;</div><div><br></div><div>class SymPL {</div><div>public:</div><div> SymPL(vector<double>  close);</div><div> void update(int idx, </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>    double  txnqty, </div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>    double  txnprc);</div><div> DataFrame toDF();</div><div>  </div><div><br></div><div> int nrow;</div><div> vector<double> txn_qty, txn_prc, txn_fee;</div>
<div>Â vector<double> pos_qty, close_prc, PL;</div><div>};</div><div><br></div><div>SymPL::SymPL(vector<double> Â close) {</div><div>Â nrow = close.size();</div><div>Â txn_qty = vector<double>(nrow);</div>
<div>Â txn_prc = vector<double>(nrow);</div><div>Â txn_fee = vector<double>(nrow);</div><div>Â pos_qty = vector<double>(nrow);</div><div>Â close_prc = vector<double>(close);</div><div>Â PL = vector<double>(nrow);</div>
<div>}</div><div><br></div><div>void SymPL::update(int  idx,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>  double  txnqty, </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>  double  txnprc) {</div>
<div>Â txn_qty[idx] = txnqty;</div><div>Â txn_prc[idx] = txnprc;</div><div>Â txn_fee[idx] = 0; Â //calfee(txnqty*txnprc); todo: write a function to cal fee</div><div>Â if(idx == 0) { //index start with 0</div><div>Â Â pos_qty[idx] = txnqty;</div>
<div>Â Â PL[idx] = txnqty * (close_prc[idx] = txnprc) - txn_fee[idx];</div><div>Â }</div><div>Â else {</div><div>Â Â pos_qty[idx] = txnqty + pos_qty[idx-1];</div><div>Â Â PL[idx] = pos_qty[idx-1] * (close_prc[idx] - close_prc[idx-1]) +Â </div>
<div>Â Â Â txnqty * (close_prc[idx] = txnprc) - txn_fee[idx];</div><div>Â }</div><div>}</div><div><br></div><div>DataFrame SymPL::toDF() {</div><div>Â DataFrame PLrecord = DataFrame::create(_["txn.qty"] = txn_qty,</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span> _["txn.prc"] = txn_prc,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> _["txn.fee"] = txn_fee,</div><div>
<span class="Apple-tab-span" style="white-space:pre"> </span> _["pos.qty"] = pos_qty,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> _["close.prc"] = close_prc,</div><div>
<span class="Apple-tab-span" style="white-space:pre"> </span> _["PL"] = PL);</div><div>Â return PLrecord;</div><div>}</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>Â </div><div>class PortPL {</div>
<div>public:</div><div>Â CharacterVector symnames;</div><div>Â int sym_num;</div><div>Â double initMoney;</div><div>Â int period_num;</div><div>Â vector<double> total_eq;</div><div>Â vector<double> total_PL;</div>
<div>Â vector<double> period_return;</div><div>Â vector<double> cum_return;</div><div>Â DatetimeVector timeindex;</div><div>Â Â </div><div>Â PortPL(SEXP times,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span> SEXP CLprc, double initM);</div>
<div> void update(int idx, NumericVector txnqty_vec, </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>    NumericVector txnprc_vec);</div><div> void exit(int idx, NumericVector txnprc_vec);</div>
<div>Â void hold(int idx);</div><div>Â NumericVector getpos(int idx);</div><div>Â List getSymPLs();</div><div><br></div><div>private:</div><div>Â vector<SymPL> symbols;</div><div><br></div><div>};</div><div><br></div>
<div>PortPL::PortPL(SEXP times,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>    SEXP CL, </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>    double initM):</div><div>
 timeindex(times) {</div><div> List CLprc(CL);</div><div> sym_num = CLprc.size();</div><div> symnames = CLprc.names();</div><div> initMoney = initM;</div><div> //timeindex = DatetimeVector(times);</div><div> period_num = timeindex.size();</div>
<div>Â Â </div><div>Â //initialize total_eq, total_PL, period_return, cum_return</div><div>Â total_eq = vector<double>(period_num);</div><div>Â total_PL = vector<double>(period_num);</div><div>Â period_return = vector<double>(period_num);</div>
<div>Â cum_return = vector<double>(period_num);</div><div>Â Â </div><div>Â //initialize each SymPL</div><div>Â for(int i = 0; i < sym_num; i++) {</div><div>Â Â vector<double> close = as<vector<double> >(CLprc[i]);</div>
<div>  symbols[i] = SymPL(close);</div><div> }</div><div>}</div><div><br></div><div>void PortPL::update(int idx, NumericVector txnqty_vec, </div><div><span class="Apple-tab-span" style="white-space:pre"> </span>    NumericVector txnprc_vec) {</div>
<div>Â double sumPL = 0;</div><div>Â for(int i = 0; i < sym_num; i++) {</div><div>Â Â symbols[i].update(idx, txnqty_vec[i], txnprc_vec[i]);</div><div>Â Â sumPL += symbols[i].PL[idx];</div><div>Â }</div><div>Â Â </div><div>
 total_PL[idx] = sumPL;</div><div> if(idx == 0) {// index starts with 0</div><div>  total_eq[idx] = initMoney + total_PL[idx];</div><div>  period_return[idx] = total_PL[idx] / initMoney;</div><div>  cum_return[idx] = total_PL[idx] / initMoney;</div>
<div>Â }</div><div>Â else {</div><div>Â Â total_eq[idx] = total_eq[idx-1] + total_PL[idx];</div><div>Â Â period_return[idx] = total_PL[idx] / total_eq[idx];</div><div>Â Â cum_return[idx] = total_eq[idx] / initMoney - 1;</div>
<div>Â }</div><div>}</div><div><br></div><div>void PortPL::hold(int idx) {</div><div>Â NumericVector tempv(sym_num, 0.0);</div><div>Â this->update(idx, tempv, tempv);</div><div>}</div><div><br></div><div>void PortPL::exit(int idx, NumericVector txnprc_vec) {</div>
<div>Â NumericVector curr_pos(sym_num);</div><div>Â for(int i = 0; i < sym_num; i++) {</div><div>Â Â curr_pos[i] = symbols[i].pos_qty[idx-1];</div><div>Â }</div><div>Â this->update(idx, curr_pos, txnprc_vec);</div><div>
}</div><div><br></div><div>NumericVector PortPL::getpos(int idx) {</div><div>Â NumericVector curr_pos(sym_num);</div><div>Â for(int i = 0; i < sym_num; i++) {</div><div>Â Â curr_pos[i] = symbols[i].pos_qty[idx-1];</div>
<div>Â }</div><div>Â return curr_pos;</div><div>}</div><div><br></div><div>List PortPL::getSymPLs() {</div><div>Â List allsym(sym_num);</div><div>Â for(int i = 0; i < sym_num; i++){</div><div>Â Â allsym[i] = symbols[i].toDF();</div>
<div>Â }</div><div>Â allsym.names() = symnames;</div><div>Â return allsym;</div><div>}</div><div><br></div><div>RCPP_MODULE(PortPL_module) {</div><div>Â class_<PortPL>("PortPL")</div><div>Â Â .constructor<SEXP, SEXP, double>()</div>
<div>Â Â .field("total.eq", &PortPL::total_eq)</div><div>Â Â .field("total.PL", &PortPL::total_PL)</div><div>Â Â .field("symnames", &PortPL::symnames)</div><div>Â Â .field("cum.return", &PortPL::cum_return)</div>
<div>Â Â .field("period.return", &PortPL::period_return)</div><div>Â Â .field("initMoney", &PortPL::initMoney)</div><div>Â Â Â </div><div>Â Â .method("update", &PortPL::update)</div>
<div>Â Â .method("exit", &PortPL::exit)</div><div>Â Â .method("hold", &PortPL::hold)</div><div>Â Â .method("getpos", &PortPL::getpos)</div><div>Â Â .method("getSymPLs", &PortPL::getSymPLs)</div>
<div>Â Â ;</div><div>}</div></div><div><br></div><div>#######################################################################</div><div><br></div><div>## R code</div><div><div>library(inline)</div><div>library(Rcpp)</div>
<div><br></div><div>fx <- cxxfunction(signature(), Â Â Â Â Â Â Â Â Â </div><div>Â Â Â Â Â Â Â Â Â includes = paste(readLines("PnL module.cpp"),</div><div>Â Â Â Â Â Â Â Â Â Â collapse = Â "\n"),</div><div>
         plugin = "Rcpp")</div><div><br></div><div>port <- Module("PortPL_module", getDynLib(fx)) </div><div>PortPL <- port$PortPL</div><div><br></div><div>datel <- as.POSIXct(Sys.Date()+1:10)</div>
<div>colse <- 1:10</div><div>initM <- 1e5</div><div><br></div><div>testport <- new(PortPL, datel, list(hjs=colse), initM)</div></div><div><br></div><div>Then the R crash with error message:</div><div><br></div><div>
<div>*** caught segfault ***</div><div>address (nil), cause 'memory not mapped'</div><div><br></div><div>Traceback:</div><div>Â 1: .External(class__newInstance, module, pointer, ...)</div><div>Â 2: new_CppObject_xp(fields$.module, fields$.pointer, ...)</div>
<div>Â 3: Rcpp:::cpp_object_initializer(.self, .refClassDef, ...)</div><div>Â 4: .Object$initialize(...)</div><div>Â 5: initialize(value, ...)</div><div>Â 6: initialize(value, ...)</div><div>Â 7: new(PortPL, datel, list(hjs = colse), initM)</div>
<div><br></div><div>Possible actions:</div><div>1: abort (with core dump, if enabled)</div><div>2: normal R exit</div><div>3: exit R without saving workspace</div><div>4: exit R saving workspace</div><div>Selection:</div>
</div><div><br></div><div>######################################################################</div><div>I just can not figure out what is wrong, Is there anyone can help me check out? Thanks in advance!</div><div><br></div>
<div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div>