在尝试实现某个功能的Rcpp中发现segfault、内存未映射错误
我是Rcpp的新手,我对Rcpp不太了解。但作为一个个人项目,我尝试使用我拥有的一些C代码运行一些排序算法,用Rcpp将它们转换为R 但是我得到了内存未映射错误,我真的不明白我做错了什么,所以如果有人能启发我:) 当用户尝试以下代码时,就会出现问题在尝试实现某个功能的Rcpp中发现segfault、内存未映射错误,r,mergesort,rcpp,R,Mergesort,Rcpp,我是Rcpp的新手,我对Rcpp不太了解。但作为一个个人项目,我尝试使用我拥有的一些C代码运行一些排序算法,用Rcpp将它们转换为R 但是我得到了内存未映射错误,我真的不明白我做错了什么,所以如果有人能启发我:) 当用户尝试以下代码时,就会出现问题 #include <Rcpp.h> using namespace Rcpp; void intercala(int p, int q, int r, NumericVector v) { int i, j, k; Numeri
#include <Rcpp.h>
using namespace Rcpp;
void intercala(int p, int q, int r, NumericVector v)
{
int i, j, k;
NumericVector w = NumericVector::create();
i = p;
j = q;
k = 0;
while (i < q && j < r) {
if (v[i] < v[j]) {
w[k] = v[i];
i++;
}
else {
w[k] = v[j];
j++;
}
k++;
}
while (i < q) {
w[k] = v[i];
i++;
k++;
}
while (j < r) {
w[k] = v[j];
j++;
k++;
}
for (i = p; i < r; i++)
v[i] = w[i-p];
}
void mergesort(int p, int r, NumericVector v)
{
int q;
if (p < r - 1) {
q = (p + r) / 2;
mergesort(p, q, v);
mergesort(q, r, v);
intercala(p, q, r, v);
}
}
// [[Rcpp::export]]
NumericVector mergesortC(NumericVector vetor) {
int n = vetor.size();
mergesort(0,n,vetor);
return vetor;
}
#包括
使用名称空间Rcpp;
void intercala(int p,int q,int r,数值向量v)
{
int i,j,k;
NumericVector w=NumericVector::create();
i=p;
j=q;
k=0;
而(i
此代码位于名为merge.cpp的文件中
当我试着在R上跑步的时候
> library(Rcpp)
> sourceCpp("merge.cpp")
> vetor<-sample(1:10)
> vetor
[1] 1 5 7 4 3 8 9 2 10 6
> mergesortC(vetor)
[1] 1 2 3 4 5 6 7 8 9 10
> vetor
*** caught segfault ***
address 0x8, cause 'memory not mapped'
Possible actions:
1: abort (with core dump, if enabled)
2: normal R exit
3: exit R without saving workspace
4: exit R saving workspace
Selection:
>库(Rcpp)
>sourceCpp(“merge.cpp”)
>兽医
[1] 1 5 7 4 3 8 9 2 10 6
>合并SORTC(审查员)
[1] 1 2 3 4 5 6 7 8 9 10
>兽医
***抓住断层***
地址0x8,导致“内存未映射”
可能采取的行动:
1:中止(如果启用,则使用堆芯转储)
2:正常R出口
3:退出R而不保存工作区
4:退出R保存工作区
选择:
在我看来,我正在做一些我不应该做的事情,但是代码似乎在一开始就工作了,然后我不知何故弄乱了object vetor中的内存。我设法用Rcpp研究了其他算法,但这一个不起作用,我不明白我做错了什么,所以如果有人能抽出一点时间的话。
NumericVector w=NumericVector::create()代码>创建一个长度为0的数字向量——然后尝试用值填充该向量。你可能想用一些预先分配的大小初始化一个向量(注意,Rcpp向量不会像std::vector
那样高效地增长——但无论如何,为什么不在那里使用std::vector
?另外,我认为你应该预先分配/使用push_back()
好的评论,但我们要强调的是,我们不建议在Rcpp向量上使用push_back()
,因为底层的SEXP
在每次修改时都需要被复制--效率很低。@Augusto:这是一个公平的开始,但我建议您至少读一点关于Rcpp的内容,和/或研究一些示例。对,抱歉--我的意思是说,在这里使用std::vector
表示w
,加上vector::push_back
,可能会更好。@DirkEddelbuettel我想当一切都开始工作时,我太兴奋了,我现在正在阅读教程。