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

如果您发现自己#include 一个 .c 文件,那么很可能您做错了什么。你真的应该只#include .h 文件。

这个维基百科链接准确地解释了您遇到的问题以及如何正确编写头文件。

我怀疑您的问题是您没有正确使用标题“守卫”。

于 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 */

主程序

#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 回答