Вынести табличные данные за код программы.

Модератор: Модераторы разделов

sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Вынести табличные данные за код программы.

Сообщение sciko »

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

+ для каждой таблицы есть свои правила обработки (например, для одной таблицы данные, не попавшие точно в значения из таблицы, надо линейно интерполировать, для другой таблицы надо брать ближайшее большее и т.п.).

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

Кто что посоветует?
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 865
Статус: Оператор вычислительных машин
ОС: Debian

Re: Вынести табличные данные за код программы.

Сообщение Janik »

Программа обрабатывает таблицы в пакетном режиме? Тогда можно попробовать через командную строку задавать правила
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Вынести табличные данные за код программы.

Сообщение sciko »

Janik писал(а):
29.04.2012 14:10
Программа обрабатывает таблицы в пакетном режиме?
Не совсем.
Думаю нужен пример:

Пусть программа ищет сечение провода по экономической плотности тока. Для этого нужно вычислить выражение S=\frac{I}{J_\text{эк}}
При этом J_\text{эк} берётся из таблицы ПУЭ в зависимости от типа проводника и числа часов использования.

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

ЗЫ. Забыл написать, что код на C + glib.
Спасибо сказали:
Аватара пользователя
DaemonTux
Сообщения: 1480
Статус: Юный падаван
ОС: Gentoo

Re: Вынести табличные данные за код программы.

Сообщение DaemonTux »

Может имеет смысл использовать какой нибудь движок базы данных. Например sqlite
Vladivostok Linux User Group
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 865
Статус: Оператор вычислительных машин
ОС: Debian

Re: Вынести табличные данные за код программы.

Сообщение Janik »

sciko писал(а):
29.04.2012 16:25
Сейчас эта таблица записана как функция от двух переменных, а я хочу вынести её за код.

Ну тогда можно записать эту таблицу как бинарный файл

Код: Выделить всё

typedef struct
{
    int cond_type;
    int hours;
    int diameter;
} value_t;

Потом надо загрузить его и искать нужное значение
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Вынести табличные данные за код программы.

Сообщение sciko »

DaemonTux писал(а):
29.04.2012 19:25
Может имеет смысл использовать какой нибудь движок базы данных. Например sqlite

А смысл? Таблицы сами по себе небольшие, но их много. Связей между ними нет. Кроме того, часто нужно интерполировать между соседними значениями (в РСУБД это сложно) или ещё проводить какую-то обработку изначений из соседних строк. Короче, РСУБД тут совсем не в тему.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Вынести табличные данные за код программы.

Сообщение sciko »

Janik писал(а):
29.04.2012 19:45
Ну тогда можно записать эту таблицу как бинарный файл
Сейчас собственно так и сделано. Но что писать в отдельный бинарник, что писать вкомпиленний в код массив разница невелика: править сложно.

В идеале хотелось бы, чтобы читался текстовый файл и по его данным создавалась бы функция от одной до трёх переменных. Но на С создать функцию в ходе выполнения невозможно.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Вынести табличные данные за код программы.

Сообщение sash-kan »

sciko писал(а):
29.04.2012 20:15
Но на С создать функцию в ходе выполнения невозможно.
встраиваемый интерпретатор?
вот буквально на днях читал про очень «правильный» (и поэтому, вероятно, очень малораспространённый) «чай-скрипт» (да, именно «чай», как противоположность «java») http://osa.samag.ru/info/OpenSource105

есть, конечно, и более распространённые — lua, scheme и т. д. и т. п.

upd. нет, chaiscript вам не пойдёт, ибо c++·
но остаются другие: и lua, и scheme, и иже с ними·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Вынести табличные данные за код программы.

Сообщение NickLion »

sciko писал(а):
29.04.2012 20:15
Но на С создать функцию в ходе выполнения невозможно.

Во-первых, можно, просто немного сложно.
Во-вторых, проще построить дерево вычислений на основе выражения. Производительность вполне нормальная. Парсер выражений вещь не сверх сложная.
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Вынести табличные данные за код программы.

Сообщение sciko »

sash-kan писал(а):
30.04.2012 03:19
встраиваемый интерпретатор?

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

NickLion писал(а):
30.04.2012 15:02
Во-первых, можно, просто немного сложно.
О! А как? Подскажите хотя бы для общего развития.
Спасибо сказали:
Аватара пользователя
Janik
Сообщения: 865
Статус: Оператор вычислительных машин
ОС: Debian

Re: Вынести табличные данные за код программы.

Сообщение Janik »

sciko писал(а):
01.05.2012 00:15
сколько их воспринимать, т. к. они для этого не предназначены.

В смысле? Поподробней пожалуйста
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Спасибо сказали:
Аватара пользователя
Portnov
Модератор
Сообщения: 1786
Статус: Матёрый линуксоид
ОС: Debian testing/unstable

Re: Вынести табличные данные за код программы.

Сообщение Portnov »

sciko
Приведите уже пример такой «таблицы», чтобы можно было что-то конкретное предложить.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Вынести табличные данные за код программы.

Сообщение NickLion »

sciko писал(а):
01.05.2012 00:15
Подскажите хотя бы для общего развития.

По-сути это JIT компиляция. Парсится выражение, строится дерево вычислений, упрощается, если это возможно (вычисляются константные выражения, к примеру), а потом переводится в машинный код, оформляется в виде функции — пролог, вычисление, эпилог. В переменную указатель на функцию помещаем адрес и готово — можно вызывать. Главное — соответствие прототипа. Перевод в машинный код — это по сути компилятор, самое сложное в данной задаче. Для простых выражений сравнительно нетрудно, но когда упираемся в ограничения архитектуры то приходится усложнить, например, сохранять в стек промежуточные этапы.
Спасибо сказали:
Аватара пользователя
Фантом
Сообщения: 462
ОС: openSUSE

Re: Вынести табличные данные за код программы.

Сообщение Фантом »

sciko писал(а):
01.05.2012 00:15
Думал над этим вариантом, но проблема в том, что в этих языках даже не сколько сложно записывать таблицы, сколько их воспринимать, т. к. они для этого не предназначены.

Берите в качестве встраиваемого языка Lua. Он состоит из работы с таблицами чуть менее, чем полностью. ;)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Вынести табличные данные за код программы.

Сообщение sash-kan »

Фантом писал(а):
01.05.2012 15:51
sciko писал(а):
01.05.2012 00:15
Думал над этим вариантом, но проблема в том, что в этих языках даже не сколько сложно записывать таблицы, сколько их воспринимать, т. к. они для этого не предназначены.

Берите в качестве встраиваемого языка Lua. Он состоит из работы с таблицами чуть менее, чем полностью. ;)
добавлю и про упомянутый мною (после lua) scheme: он состоит из работы с таблицами[*] гораздо более, чем полностью·

[*] что есть список? таблица!
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Вынести табличные данные за код программы.

Сообщение diesel »

sciko писал(а):
29.04.2012 20:15
Janik писал(а):
29.04.2012 19:45
Ну тогда можно записать эту таблицу как бинарный файл
Сейчас собственно так и сделано. Но что писать в отдельный бинарник, что писать вкомпиленний в код массив разница невелика: править сложно.

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

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

Если формат таблиц примерно один и тот же, например csv файлы с соответствующими хэдерами, то по-сути может быть много мелких функций, которые вполне в курсе того что им нужно найти, где и по каким критериям, и один большой "поисковик", который получает критерии поиска(читай "значения хэдеров csv-файла", то есть те самые "диаметр", "время"), соответствующие им величины, ну, и, возможно, имена полей в которых находится искомый результат(результаты), и отдает то что просили.

Конечно, в случае если "мелкие" функции можно было бы сгенерировать, или, наоборот, если что-то типа рубишного method missing, когда зовешь несуществующую функцию, а она выдает вполне конкретный результат, основываясь на том что и как позвал - это красивше, как идея. Но все же, можно и без этого. Тем более что вы вполне знаете что вам понадобится, как оно представлено итп, то есть основные функции/формулы вы на ходу не конструируете, и неизвестных значений, подставляемых в неизвестные формулы у вас не появляется в рантайме.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вынести табличные данные за код программы.

Сообщение drBatty »

sciko писал(а):
29.04.2012 20:15
В идеале хотелось бы, чтобы читался текстовый файл и по его данным создавалась бы функция от одной до трёх переменных. Но на С создать функцию в ходе выполнения невозможно.

ИМХО это и не нужно. В большинстве случаев лексемы довольно большие, и оверхед в С несущественный (можно использовать например массив указателей на функции, который индексировать хешем лексемы). В С++ удобно использовать вируальные функции (на самом деле, это тот же массив указателей на функции, просто с "сахаром").
NickLion писал(а):
01.05.2012 11:19
По-сути это JIT компиляция. Парсится выражение, строится дерево вычислений, упрощается, если это возможно (вычисляются константные выражения, к примеру), а потом переводится в машинный код, оформляется в виде функции — пролог, вычисление, эпилог. В переменную указатель на функцию помещаем адрес и готово — можно вызывать.

1. это грязный хак. (ибо не нужно выполнять данные).
2. это даст копеечный выигрыш.
3. сегодня это будет работать, а завтра это станет настолько долго, что съест этот ваш копеечный выигрыш. Проблема в том, что ваш компилятор не в курсе, что за команды появятся завтра.
diesel писал(а):
01.05.2012 18:23
Конечно, в случае если "мелкие" функции можно было бы сгенерировать, или, наоборот, если что-то типа рубишного method missing, когда зовешь несуществующую функцию, а она выдает вполне конкретный результат, основываясь на том что и как позвал - это красивше, как идея.

в C несложно взять маленький хеш от лексемы (например в 1 байт), и составить таблицу (к примеру в 256 указателей на функции), причём (почти)каждая лексема будет иметь уникальный хеш, а ненужные дырки в таблице мы можем забить дефолтной функцией.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Вынести табличные данные за код программы.

Сообщение drBatty »

sciko писал(а):
29.04.2012 16:25
Думаю, что проще всего таблицу записать в файл и считывать её как часть конфига. Вот только в каком формате её лучше записать и как представить в коде чтобы минимизировать переделки.

возможно, что оптимальным вариантом будет что-то похожее на SQL язык (это НЕ относится никак к СУБД, базы данных - это другое. У вас УЖЕ есть какие-то таблицы, и вам только требуется язык их обработки. Я НЕ предлагаю писать что-то типа MySQL, я предлагаю обратить внимание на синтаксис SQL запросов)
sash-kan писал(а):
01.05.2012 17:48
добавлю и про упомянутый мною (после lua) scheme: он состоит из работы с таблицами[*] гораздо более, чем полностью·
[*] что есть список? таблица!

вообще-то эти языки самодостаточны, и таблицы/списки там - часть языка. Не думаю, что такой синтаксис будет более удобен. Хотя конечно зависит от задачи (и от знания этого синтаксиса, тем, кто будет это реализовывать.)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Вынести табличные данные за код программы.

Сообщение sash-kan »

drBatty писал(а):
02.05.2012 11:09
вообще-то эти языки самодостаточны
вообще-то в мои слова закралась небольшая ошибка — вместо scheme следует читать guile (уже не первый раз путаю)·
по поводу самодостаточности/самостоятельности lua и guile:
wikipedia://lua (programming language): designed as a scripting language with "extensible semantics" as a primary goal
wikipedia://GNU Guile: stands for the GNU Ubiquitous Intelligent Language for Extensions
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Вынести табличные данные за код программы.

Сообщение diesel »

drBatty писал(а):
02.05.2012 11:02
diesel писал(а):
01.05.2012 18:23
Конечно, в случае если "мелкие" функции можно было бы сгенерировать, или, наоборот, если что-то типа рубишного method missing, когда зовешь несуществующую функцию, а она выдает вполне конкретный результат, основываясь на том что и как позвал - это красивше, как идея.

в C несложно взять маленький хеш от лексемы (например в 1 байт), и составить таблицу (к примеру в 256 указателей на функции), причём (почти)каждая лексема будет иметь уникальный хеш, а ненужные дырки в таблице мы можем забить дефолтной функцией.

а способ получения функций, на которые вы будете делать указатели?
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Вынести табличные данные за код программы.

Сообщение Crazy »

sciko писал(а):
29.04.2012 20:15
В идеале хотелось бы, чтобы читался текстовый файл и по его данным создавалась бы функция от одной до трёх переменных. Но на С создать функцию в ходе выполнения невозможно.

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

Desipere in loco
Спасибо сказали: