在[R]函数中捕获了段错误

时间:2012-02-28 17:57:36

标签: c r

我对C很新,但知道我的方式[R]。这个错误在C中可能是一个非常愚蠢的错误。

我的C代码执行内核平滑。

* 当我注释掉我的函数的最后一行代码时:results [i] = v; *

这个电话杀死了R:

  

new.y< -zsmooth2(x = c(0:80000),xpts = dat $ V2,ypts = dat $ V4,h = 10000)

*抓住了段错* 地址0x1184f8000,导致'内存未映射'

回溯:  1:.C(“kernel_smooth”,as.double(x),as.double(ypts),as.double(xpts),as.integer(n),as.integer(nxpts),as.double(h) ,result = double(length(xpts)))  2:zsmooth2(x = c(0:80000),xpts = dat $ V2,ypts = dat $ V4,h = 10000)

C代码:

#include <R.h>
#include <Rmath.h>
#include <stdio.h>


void kernel_smooth(double *x, double *ypts,  double *xpts, int *n, int *nxpts, double *h, double *results){
    int i, j;

    for(i = 0; i < *n; i++){

        double nsum = 0;
        double dsum = 0;

        double z = x[i] + *h;
        double y = x[i] - *h;

        for(j = 0; j < *nxpts; j++){

            if(xpts[j] < y){
                continue;
            }   
            if(xpts[j] > z){
                break;
            }   
            double d = (xpts[j] - i) / *h;
            double r = dnorm(d, 0, 1, 0);
            nsum += r * ypts[j];
            dsum += r;  
        }   
            Rprintf("test:i %d\n", i);  
            double v = nsum / dsum;
            Rprintf("test:v %f\n", v);  

         results[i] = v;  
    }

}

R-代码:

 dyn.load("~/github/ZevRTricks/smoother1.so")
 zsmooth2<-function(x, ypts, xpts, h){
    n <- length(x)
    nxpts <- length(xpts)
    dens  <- .C("kernel_smooth", as.double(x), as.double(ypts), 
                as.double(xpts), as.integer(n), as.integer(nxpts), 
                as.double(h), result = double(length(xpts)))
dens[["result"]]
}

1 个答案:

答案 0 :(得分:2)

xptsypts是向量,在您的C代码中,您尝试访问每个元素中的元素1到nnx的长度,在第二个示例中比第一个示例长100倍。将seq(from = 0, to = 80000 by = 100)0:80000进行比较,(当您在此时,您可以从c()周围删除0:80000)。

所以我猜xptsypts长度至少为801个元素,但少于80001个元素。你把某个地方的索引搞砸了。

另请注意,您已将x传递给C代码,但实际上并未将其用于任何内容。