我对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"]]
}
答案 0 :(得分:2)
xpts
和ypts
是向量,在您的C代码中,您尝试访问每个元素中的元素1到n
。 n
是x
的长度,在第二个示例中比第一个示例长100倍。将seq(from = 0, to = 80000 by = 100)
与0:80000
进行比较,(当您在此时,您可以从c()
周围删除0:80000
)。
所以我猜xpts
和ypts
长度至少为801个元素,但少于80001个元素。你把某个地方的索引搞砸了。
另请注意,您已将x
传递给C代码,但实际上并未将其用于任何内容。