2012-02-28 14 views
1

私は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"]] 
} 
+0

あなたはC#フォーラムに投稿されたCコードを持っています。 – MethodMan

+0

CとC#はまったく異なる2つの言語です。あなたはその名前を同じ意味で使用するだけではありません。 – BoltClock

+0

私が知っている限り、あなたはRで簡単にC#を使うことはできません。コードは本当にCですか? –

答えて

2

xptsおよびyptsはベクトルであり、あなたのCコードでは、それぞれ1〜nの要素にアクセスしようとしています。 nの長さはxです。これは、2番目の例では最初の例よりも100倍長くなります。 seq(from = 0, to = 80000 by = 100)0:80000を比較してください.からc()を削除してください。

だから私はxptsyptsは少なくとも801要素で、80001要素より少ないと思います。あなたはどこかであなたの索引付けを台無しにしました。

xをCコードに渡しますが、実際には何も使用しないことに注意してください。

+0

テストしていませんが、あなたが正しいと確信しています。 xより大きい値とyより小さい値の戻り値をどのようにしてインデックス(配列用)として返すことができるか質問できますか? –

+0

あなたがCのforループについて話しているなら、 'for(i = x; i Tyler

+0

あなたの助けてくれてありがとう、しかし、私のコードを修正した後でもエラーをキャッチします。私はそれを上に更新しました。 –

関連する問題