1

物理シミュレーション ソフトウェアを作成する必要があり、D.Knuth によって作成された疑似乱数発生器を使用する必要があります。これは、私のニーズに最も適しているためです。

コードのハード ブロック (単なる #include "rng-double.c") 内で使用する方法は知っていますが、メインとブロックの両方で必要なモジュラー プログラムに含める方法がよくわかりません。いくつかのライブラリ内で、ヘッダー ファイルを介してメインにリンクします。

必要な関数は、ジェネレーターをシードするための ranf_start(seed) と、次の数値を生成するための ranf_arr_next() だけです。

私は長いシリーズを取得しています

multiple definitions of 'foo'

乱数発生器のコードで定義されているほとんどすべての関数に対して。

私は専門家ではないので、ほとんど行き詰まっています。抜け道はありますか?まだ成功していませんが、現在 rng のヘッダー ファイルを書き込もうとしています。

どうもありがとう、みんな。~J

編集:最初の回答が言うことから、ヘッダーファイルを書く必要があります。ジェネレーターのほとんどの関数でそれを行いましたが、実際に数値を生成する関数に対して正しく書くことができません。このように定義された関数のヘッダーはどのように記述すればよいですか?

#define ranf_arr_next() (*ranf_arr_ptr>=0? *ranf_arr_ptr++: ranf_arr_cycle())
4

3 に答える 3

5

.c ファイルは含めませんが、関数の宣言を含む適切なヘッダー ファイルを含めます。.c ファイルは残りと一緒にコンパイルされます。

于 2010-10-17T16:50:14.383 に答える
2

.c ファイルを #include していることに気付いた場合は、何か間違ったことをしている可能性があります。.h ファイルのみを #include する必要があります。

このウィキペディアのリンクは、あなたが抱えている問題とヘッダーファイルを正しく書く方法を正確に説明しています.

あなたの問題は、ヘッダーの「ガード」を適切に使用していないことだと思います。

于 2010-10-17T16:55:49.063 に答える
1

rng-double.h

#ifndef RNG_DOUBLE_H_INCLUDED
#define RNG_DOUBLE_H_INCLUDED

extern void ranf_start(long seed);
extern double ranf_next(void);

#ifdef USE_MACRO_RANF_NEXT
extern double *ranf_arr_ptr;
extern double  ranf_arr_cycle(void);
#define ranf_arr_next() (*ranf_arr_ptr >= 0 ? *ranf_ptr++ : ranf_arr_cycle())
#endif /* USE_MACRO_RANF_NEXT */

#endif /* RNG_DOUBLE_H_INCLUDED */

main.c

#include "rng-double.h"
...other stuff...

rng-double.c

#define USE_MACRO_RANF_NEXT
#include "rng-double.h"

double *ranf_arr_ptr;

void ranf_start(long seed)
{
    ...implementation...
}

double (ranf_next)(void)  // Function
{
    ranf_next();          // Macro
}

double ranf_arr_cycle(void)
{
    ...implementation...
}
于 2010-10-17T18:28:23.797 に答える