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言語の勉強を再開する。