私はCの新機能ですが、[R]を回避する方法を知っています。このエラーはC言語では非常にばかげたミスです。[R]機能でsegfaultが検出されました
私の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(YP 2:zsmooth2(x = c(t))、as.double(xpts)、as.integer(n)、as.integer(nxpts)、as.double(h)、result = double(length(xpts) 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"]]
}
あなたはC#フォーラムに投稿されたCコードを持っています。 – MethodMan
CとC#はまったく異なる2つの言語です。あなたはその名前を同じ意味で使用するだけではありません。 – BoltClock
私が知っている限り、あなたはRで簡単にC#を使うことはできません。コードは本当にCですか? –