LINUX.ORG.RU

табличные функции

 


0

1

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

★★★★★

Последнее исправление: cetjs2 (всего исправлений: 1)

Легко: вычисляем отдельно, заполняя заголовочный файл константами. При компиляции подключаем этот файл.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

а не лучше генерить в .c файл, а в заголовочном всегда иметь только определение?

//это я с точки зрения времени компиляции и отсутствия lto по умолчанию

seed_stil ★★
()
Ответ на: комментарий от seed_stil

Если эта штука должна быть в нескольких файлах, то да — отдельно сделать объявления и в один сишный файл закинуть определения. А если так не надо — то без разницы.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от seed_stil

Мимими, какая няша на аватаре!

anonymous
()

Кстати, можно вообще табличные функции загнать в файлик БД sqlite, вкомпилить его в бинарник и через shm с ним работать. Или просто отдельным файлом держать.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

а можешь по подробнее объяснить (я (пока) в тонкостях компиляции очень плохо разбираюсь)

thunar ★★★★★
() автор топика
Ответ на: комментарий от thunar

Допустим, нам надо (скажем, при помощи octave) заполнить для вектора X значения функции Y. И пусть наша функция используется в нескольких файлах. Тогда делаем в октаве:

f_C = fopen("table.c", "w");
f_H = fopen("table.h", "w");
X = [массив иксов]; % (или из файла читаем)
Y = f(X); % f(X) - требуемая функция
sz = sizeof(X);
fprintf(f_H, "extern double X[%d], Y[%d];\n", sz, sz);
fprintf(f_C, "double X[%d] = ", sz);
fprintf(f_C, "%g, ", X(1:end-1));
fprintf(f_C, "%g;\n", X(end));
fclose(f_C);
% и точно так же для значений Y
Потом указываем в Makefile/Cmake/automake, что этот table.c нужно скомпилировать при помощи gcc и слинковать с остальными объектниками (которые на фортране).

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

А вообще, я просто уже давным-давно забыл фортран. Но сдается мне, что можно то же самое сделать прямо в фортрановский файл.

P.S. Шапки файлов можно как отредактировать вручную, так и в октаве заполнить. А учитывая то, что октаву можно из make'а запустить, все это дело вполне можно генерировать и в процессе компиляции.

Eddy_Em ☆☆☆☆☆
()

А зачем на этапе компиляции? Напиши просто функции по генерированию таблички (и запись ей в файл) и подсосу таблички тогда, когда она понадобиться.

aedeph_ ★★
()

Вычисления на этапе компиляции (Compile-time calculation) в Фортране реализуются через PARAMETER, только не понятно, это ли вам надо.

Возможно, что вам нужно просто организовать процесс сборки/компиляции программы так, чтобы запускались другие программы, генерирующие нужный файл с данными/кодом. Но это уже зависит от того, чем ведётся сборка программы.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.