У меня есть простая обертка для генератора случайных чисел Мерсена. Цель состоит в том, чтобы масштабировать число, возвращаемое генератором (между 0 и 1), между заданными пределами аргумента (начало и конец).
Так что моя функция
inline float xlRandomFloat(float begin, float end) {return (begin+((end-begin)*genrand_real2()));}
Я не верю, что реализация функции genrand_real2 () важна, но если я ошибаюсь, ее можно найти здесь
Проблема в том, что функция не возвращает переведенный результат. Масштабирование (умножение на (начало-конец), кажется, работает правильно, но добавление начала, похоже, не возвращается.
Так что, если я вызову xlRandomFloat (5,10) - я получу значения от 0 до 5.
Если я отлаживаю с GDB и использую функцию печати, тогда он показывает правильный результат.
Тогда я попытался разделить вещи на строки, чтобы увидеть, что происходит
inline float xlRandomFloat(float begin, float end) {
float ret;
ret=(((end-begin)*genrand_real2()));
ret+=begin;
return ret;};
При отладке он сразу переходил с первой строки в функцию genrand_real2 () и полностью пропускал все остальное. Это действительно сбивало с толку, поэтому я подумал, что это как-то связано с встраиванием.
Я переместил файл из этого файла .hpp в .cpp и удалил ключевое слово inline, и все работает правильно.
Но почему это происходит, и как я могу встроить эту функцию? Кроме того, я не уверен, что это актуально, но часто, когда я вносил изменения в источники, моя компиляция Make говорила, что ничего не поделаешь. Что необычно, так как обычно я ожидаю, что make обнаружит изменения в исходных текстах и перестроит их соответствующим образом.
Любые идеи.
Спасибо
Зенна