読者です 読者をやめる 読者になる 読者になる

R Space interpolation 空間補間 ソースコード編集1

この前勉強した空間補間のパッケージgstatを使っていたら、krige関数を使うところで、次の様なエラーが発生。

> P.dat.krige <- krige(Intensity~1, P.dat, dat.grid, model = P.m)
[using ordinary kriging]

"memory.c", line 58: can't allocate memory in function m_get()
predict.gstat(g, newdata = newdata, block = block, nsim = nsim,:m_get

前回考えたように、C言語のソースに問題があるようなので、ココからgstatを直接ダウンロードし、viモードで開いてみる。問題となっているのはline58とのことなので、1~65行目を抜粋。

/* memory.c 1.3 11/25/87 */

#include        "matrix.h"

/*
static  char    rcsid[] = "$Id: memory.c,v 1.1.1.1 2003-06-23 18:31:37 cees Exp $";
*/

/* m_get -- gets an mxn matrix (in MAT form) by dynamic memory allocation */
MAT     *m_get(m,n)    //MAT型のポインタ変数*m_get(m,n)を定義
int     m,n;       //int型の変数m,nを定義
{
   MAT  *matrix;
   int  i;

   if (m < 0 || n < 0)     //m,nが負なら
     error(E_NEG,"m_get");   //エラーを表示するという意味?

   if {(matrix=NEW(MAT)) == (MAT *)NULL}  //※文字化け対策で()を{}にしています
     error(E_MEM,"m_get");                 //エラーを表示
   else if (mem_info_is_on()) {       //ここによると"record how many bytes is allocated"らしい。
      mem_bytes(TYPE_MAT,0,sizeof(MAT));
      mem_numvar(TYPE_MAT,1);
   }

   matrix->m = m;   //構造体のポインタ
matrix->n = matrix->max_n = n; matrix->max_m = m;
matrix->max_size = m*n;
#ifndef SEGMENTED //SEGMENTEDが定義されていないときのみコンパイルされる、という意味。 if {(matrix->base = NEW_A(m*n,Real)) == (Real *)NULL} //この条件を満たせばエラーとなる。※文字化け対策で()を{}にしています { free(matrix); error(E_MEM,"m_get"); //ココでエラーらしい。 } else if (mem_info_is_on()) { mem_bytes(TYPE_MAT,0,m*n*sizeof(Real)); } #else matrix->base = (Real *)NULL; #endif

 どうやら、

#ifndef SEGMENTED //SEGMENTEDが定義されていないときのみコンパイルされる、という意味。
if {(matrix->base = NEW_A(m*n,Real)) == (Real *)NULL} //※文字化け対策で()を{}にしています

を満たしたが故にエラーとなっているようだ。しかし、matrix->base = NEW_A(m*n,Real)) == (Real *)NULLの意味がわからない(特にNEW_A関数の意味、(Real *)NULLという書き方がちょっと調べただけではわからない)。保留することにする。もう少し理解を深めないと恩恵には預かれないようなので、C言語の勉強を再開する。