2012-02-28 39 views
1

我对C很新,但知道我的方式[R]。这个错误可能是C中一个非常愚蠢的错误。我的C代码确实内核平滑。在[R]函数中捕获了段错误

* 当我注释掉代码的最后一行时,我的函数有效: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(YP ts),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"]] 
} 
+0

你有C代码张贴在C#论坛中.. – MethodMan 2012-02-28 18:00:59

+0

C和C#是两种完全不同的语言。你不只是交替使用他们的名字。 – BoltClock 2012-02-28 18:04:55

+0

据我所知,你不能轻易地使用C#与R所以代码真的C? – 2012-02-28 18:22:00

回答

2

xpts and ypts是向量,并且在您的C代码中,您尝试访问其中每个元素的元素1到nnx的长度,在第二个示例中比第一个示例长100倍。比较seq(from = 0, to = 80000 by = 100)0:80000,(并且当你在它时,你可以从0:80000附近删除c())。

所以我想这xptsypts至少801元长,但低于80001元。你已经搞乱了你的索引。

还要注意,您将x传递给您的C代码,但实际上并未将其用于任何事情。

+0

还没有测试过,但我确定你是正确的。请问我该如何返回一个索引(对于一个数组),其值大于x且小于y? – 2012-02-28 21:11:42

+0

如果你在谈论C语言中的for循环,就像'for(i = x; i Tyler 2012-02-28 21:37:49

+0

感谢您的帮助,但在修复我的代码后仍然捕获错误。我在上面更新了它。 – 2012-03-01 04:06:10