2013-11-28 146 views
2

我正在使用Rcpp和模塊將一些用C++編寫的MCMC軟件轉換爲R包。在這方面,我需要維護一個全局變量的指針,並指向某個類的最新對象。C++全局變量導致段錯誤

這裏是在R-腳本的形式很簡單的例子:

require(Rcpp) 
require(inline) 

inc <- ' 

using namespace Rcpp; 

class test; 
test* glob; //global pointer 


class test{ 
    private: 
    double foo; 
    public: 
    test(double foo_) : foo(foo_) { 
     glob=this; // the line causes segfault 
    }; 
    double get_foo(){return foo;}; 
}; 

RCPP_MODULE(test){ 
    class_<test>("test") 
    .constructor<double>() 
    .property("foo",&test::get_foo) 
    ; 

} 

' 

fx <- cxxfunction(signature(),plugin="Rcpp",include=inc); 
test_module <- Module("test",getDynLib(fx)) 
test <- test_module$test 
t1 <- new(test,1.0) 

我試圖讓在是類似以下內容(C++):

#include<iostream> 

class test; 
test* glob; 


class test{ 
    private: 
    double foo; 
    public: 
    test(double foo_) : foo(foo_) {glob=this;}; 
    double get_foo(){return foo;}; 
}; 

int main(){ 
    test t1(1.0); 
    test t2(2.0); 
    std::cout << (*glob).get_foo() << std::endl; 
} 

它編譯和運行,因爲它應該。

由於提前, 問候,撕毀Kleppe

+0

添加R標籤以及... –

回答

2

這似乎是兩個不相關的和簡單的錯誤。

首先,您需要製作指針static。事情然後工作。

其次,使用Rcpp模塊與inline是不是 更長的最簡單的方法,我們通常建議使用一個包或Rcpp屬性,如下所示。

正確的代碼,其中包括顯式消息傳送到stdout在構造:

#include <Rcpp.h> 

using namespace Rcpp; 

class test; 
static test* glob = NULL; //global pointer 


class test{ 
    private: 
    double foo; 
    public: 
    test(double foo_) : foo(foo_) { 
     Rcpp::Rcout << "Seeing foo_ of " << foo_ << " in ctor\n"; 
     glob=this; // the line causes segfault 
    }; 
    double get_foo(){return foo;}; 
}; 

RCPP_MODULE(test){ 
    class_<test>("test") 
    .constructor<double>() 
    .property("foo",&test::get_foo) 
    ; 
} 

然後簡單使用從命令行(使用利特勒; R或RSCRIPT是等同的):

$ r -lRcpp -e 'sourceCpp("/tmp/tore.cpp"); tt <- new(test, 1.23); print(tt$foo)' 
Seeing foo_ of 1.23 in ctor 
[1] 1.23 
$ 

注我們如何跳過所有的模塊實例化等。

+0

Dirk;非常感謝!這節省了我的一天。問候 - 去 – user3045925

+0

沒有汗水。如同這裏的習慣一樣,您可以隨意選擇「接受」答案(只要您點擊勾號標記,就可以看到您的答案),並/或點擊向上箭頭向上移動答案。這就是網站的推出方式。順便說一下,我已經提出了你的問題。 –