использование псевдослучайного генератора Д. Кнута - PullRequest
1 голос
/ 17 октября 2010

Мне нужно написать программное обеспечение для физического моделирования, и мне нужно использовать генератор псевдослучайных данных , написанный Д.Кнутом , потому что он лучше всего соответствует моим потребностям.

Хотя я знаю, как использовать его в жестком блоке кода (простой #include "rng-double.c"), я не совсем понимаю, как включить его в модульную программу, где это необходимо как в рамках основной и внутри некоторых библиотек, которые я затем связываю обратно с основной через заголовочные файлы.

Единственные функции, которые мне нужны - это ranf_start (seed) для заполнения генератора и ranf_arr_next () для генерации следующего числа.

Я получаю длинную серию

multiple definitions of 'foo'

в значительной степени для каждой функции, определенной в коде генератора случайных чисел.

Я не эксперт, поэтому нахожусь в тупике. Есть ли выход? В настоящее время я пытаюсь написать заголовочный файл для rng, хотя пока не добился успеха.

Большое спасибо всем. ~ J

EDIT: Из того, что говорят первые ответы, мне нужно записать заголовочный файл. Я сделал это для большинства функций в генераторе, но мне не удалось написать это правильно для функции, которая фактически генерирует число. Как мне написать заголовок для функции, определенной следующим образом?

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

Ответы [ 3 ]

5 голосов
/ 17 октября 2010

Вы включаете не файл .c, а соответствующий заголовочный файл, который содержит объявления ваших функций. Файл .c будет просто скомпилирован вместе с остальными.

2 голосов
/ 17 октября 2010

Если вы когда-нибудь обнаружите, что #include .c файл, то есть вероятность, что вы делаете что-то не так.Вы действительно должны быть #inc Включая только файлы .h.

Эта ссылка на Википедию точно описывает проблему, с которой вы столкнулись, и как правильно написать заголовочный файл.

Я подозреваюВаша проблема в том, что вы неправильно используете заголовок 'guard'.

1 голос
/ 17 октября 2010

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...
}
...