Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在尝试实现某个功能的Rcpp中发现segfault、内存未映射错误_R_Mergesort_Rcpp - Fatal编程技术网

在尝试实现某个功能的Rcpp中发现segfault、内存未映射错误

在尝试实现某个功能的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

我是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;
  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我想当一切都开始工作时,我太兴奋了,我现在正在阅读教程。