ページ 11

error:mtrand()

Posted: 2013年10月10日(木) 17:50
by 123
はじめまして。プログラミングを初めてまだ間もないのですが、エラーの内容がわからず質問させていただきたいと思います。

通信関連のシミュレーションのプログラムを実装して、シミュレーション結果を得ていました。
最初は順調だったのですが、パラメータを変えて実行しようとしたところ(シミュレーション上でアンテナの本数を変えるだけなので、コマンドライン入力の引数を変えただけです)、
error:mtrand()
というエラーが出てしまいました。
これは一体どのような内容なのか教えてくださると助かります。
また、他にも必要な情報があれば言ってくだされば掲載します。

Re: error:mtrand()

Posted: 2013年10月10日(木) 17:58
by 123(ヒフミ)
123(ヒフミ)です。そもそもmtrandがどのようなものか説明していませんでした。
mtrand()の乱数を用いる時に使用し、以下の様なヘッダーファイルを使用しています。
また、エラーですが実行してすぐではなく、しばらくプログラムを回したあとに出ます。

#include <stdio.h>

/* Period parameters */
#define MT_N 624
#define MT_M 397
#define MATRIX_A 0x9908b0dfUL /* constant vector a */
#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
#define LOWER_MASK 0x7fffffffUL /* least significant r bits */

typedef struct {
unsigned long x[MT_N]; /* the array for the state vector */
int index;
} state_mt;

/* initializes x[MT_N] with a seed */
state_mt *init_mtrand( unsigned long seed )
{
state_mt *mt;
int k;

if ((mt=(state_mt *)malloc(sizeof(state_mt))) != NULL) {
mt->index = 0;
mt->x[0]= seed & 0xffffffffUL;
for (k=1; k<MT_N; k++)
mt->x[k] = (1812433253UL*(mt->x[k-1]^(mt->x[k-1]>>30))+k) & 0xffffffffUL;
}
return mt;
}

/* generates a random number on [0,1)-real-interval */
double mtrand( state_mt *mt )
{
/* mag01[x] = x * MATRIX_A for x=0,1 */
static unsigned long mag01[2]={0x0UL, MATRIX_A};
static unsigned long y;
static int k;

if (mt==NULL) {
fprintf(stderr, "error: mtrand()\n"); exit(-1);
}

k = mt->index;

if (k==0) { /* generate MT_N words at one time */
for (k=0; k<MT_N-MT_M; k++) {
y = (mt->x[k]&UPPER_MASK)|(mt->x[k+1]&LOWER_MASK);
mt->x[k] = mt->x[k+MT_M] ^ (y >> 1) ^ mag01[y & 0x1UL];
}
for ( ; k<MT_N-1; k++) {
y = (mt->x[k]&UPPER_MASK)|(mt->x[k+1]&LOWER_MASK);
mt->x[k] = mt->x[k+(MT_M-MT_N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
}
y = (mt->x[MT_N-1]&UPPER_MASK)|(mt->x[0]&LOWER_MASK);
mt->x[MT_N-1] = mt->x[MT_M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
k = 0;
}

y = mt->x[k++];
mt->index = (k==MT_N) ? 0 : k;

/* Tempering */
y ^= (y >> 11);
y ^= (y << 7) & 0x9d2c5680UL;
y ^= (y << 15) & 0xefc60000UL;
y ^= (y >> 18);

return y * (1.0/4294967296.0); /* divided by 2^32 */
}

#endif

よろしくお願いします。

Re: error:mtrand()

Posted: 2013年10月10日(木) 18:28
by h2so5
init_mtrandが失敗して、state_mt構造体へのポインタがNULLになっている状態でmtrandを呼んでいるからエラーが発生していると思われます。
ヘッダーからはそれ以上のことは分かりません。

[追記]
init_mtrandをループ内で何度も呼んでいて、メモリが足りなくなってアロケーションに失敗しているという状況が考えられます。
init_mtrandを呼ぶのは最初の一回だけでよいはずです。

Re: error:mtrand()

Posted: 2013年10月11日(金) 11:52
by 123(ヒフミ)
ご指摘ありがとうございます!おっしゃっていた通りで、直してみたらうまくいきました!
ありがとうございました!