Вынести табличные данные за код программы.
Модератор: Модераторы разделов
-
sciko
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Вынести табличные данные за код программы.
Есть у меня расчётная программа, которая из всяких таблиц, взятых из нормативных документов, таскат данные, и подставляет их в формулы.
+ для каждой таблицы есть свои правила обработки (например, для одной таблицы данные, не попавшие точно в значения из таблицы, надо линейно интерполировать, для другой таблицы надо брать ближайшее большее и т.п.).
Сейчас всё это прописано в отдельной бибилиотеке в виде функций. Вот думаю, вынести эти данные из кода, но не пойму как лучше всего это представить
Кто что посоветует?
+ для каждой таблицы есть свои правила обработки (например, для одной таблицы данные, не попавшие точно в значения из таблицы, надо линейно интерполировать, для другой таблицы надо брать ближайшее большее и т.п.).
Сейчас всё это прописано в отдельной бибилиотеке в виде функций. Вот думаю, вынести эти данные из кода, но не пойму как лучше всего это представить
Кто что посоветует?
-
Janik
- Сообщения: 865
- Статус: Оператор вычислительных машин
- ОС: Debian
Re: Вынести табличные данные за код программы.
Программа обрабатывает таблицы в пакетном режиме? Тогда можно попробовать через командную строку задавать правила
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
-
sciko
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Вынести табличные данные за код программы.
Не совсем.
Думаю нужен пример:
Пусть программа ищет сечение провода по экономической плотности тока. Для этого нужно вычислить выражение S=\frac{I}{J_\text{эк}}
При этом J_\text{эк} берётся из таблицы ПУЭ в зависимости от типа проводника и числа часов использования.
Сейчас эта таблица записана как функция от двух переменных, а я хочу вынести её за код.
Думаю, что проще всего таблицу записать в файл и считывать её как часть конфига. Вот только в каком формате её лучше записать и как представить в коде чтобы минимизировать переделки.
ЗЫ. Забыл написать, что код на C + glib.
-
DaemonTux
- Сообщения: 1480
- Статус: Юный падаван
- ОС: Gentoo
Re: Вынести табличные данные за код программы.
Может имеет смысл использовать какой нибудь движок базы данных. Например sqlite
Vladivostok Linux User Group
-
Janik
- Сообщения: 865
- Статус: Оператор вычислительных машин
- ОС: Debian
Re: Вынести табличные данные за код программы.
Ну тогда можно записать эту таблицу как бинарный файл
Код: Выделить всё
typedef struct
{
int cond_type;
int hours;
int diameter;
} value_t;Потом надо загрузить его и искать нужное значение
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
-
sciko
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Вынести табличные данные за код программы.
А смысл? Таблицы сами по себе небольшие, но их много. Связей между ними нет. Кроме того, часто нужно интерполировать между соседними значениями (в РСУБД это сложно) или ещё проводить какую-то обработку изначений из соседних строк. Короче, РСУБД тут совсем не в тему.
-
sciko
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Вынести табличные данные за код программы.
Сейчас собственно так и сделано. Но что писать в отдельный бинарник, что писать вкомпиленний в код массив разница невелика: править сложно.
В идеале хотелось бы, чтобы читался текстовый файл и по его данным создавалась бы функция от одной до трёх переменных. Но на С создать функцию в ходе выполнения невозможно.
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Вынести табличные данные за код программы.
встраиваемый интерпретатор?
вот буквально на днях читал про очень «правильный» (и поэтому, вероятно, очень малораспространённый) «чай-скрипт» (да, именно «чай», как противоположность «java») http://osa.samag.ru/info/OpenSource105
есть, конечно, и более распространённые — lua, scheme и т. д. и т. п.
upd. нет, chaiscript вам не пойдёт, ибо c++·
но остаются другие: и lua, и scheme, и иже с ними·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
-
sciko
- Сообщения: 1744
- Статус: Ъ-участник
- ОС: Debian/Ubuntu/etc
Re: Вынести табличные данные за код программы.
Думал над этим вариантом, но проблема в том, что в этих языках даже не сколько сложно записывать таблицы, сколько их воспринимать, т. к. они для этого не предназначены.
О! А как? Подскажите хотя бы для общего развития.
-
Janik
- Сообщения: 865
- Статус: Оператор вычислительных машин
- ОС: Debian
Re: Вынести табличные данные за код программы.
В смысле? Поподробней пожалуйста
Кто ищет, тот всегда найдет!
Опыт - это когда все получается с первого раза.
Опыт - это когда все получается с первого раза.
-
Portnov
- Модератор
- Сообщения: 1786
- Статус: Матёрый линуксоид
- ОС: Debian testing/unstable
Re: Вынести табличные данные за код программы.
sciko
Приведите уже пример такой «таблицы», чтобы можно было что-то конкретное предложить.
Приведите уже пример такой «таблицы», чтобы можно было что-то конкретное предложить.
Работа: Ubuntu 9.10
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
Дом: Debian testing/unstable и на всякий случай winxp в virtualbox.
Для разнообразия: моя домашняя страница -http://iportnov.ru
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Вынести табличные данные за код программы.
По-сути это JIT компиляция. Парсится выражение, строится дерево вычислений, упрощается, если это возможно (вычисляются константные выражения, к примеру), а потом переводится в машинный код, оформляется в виде функции — пролог, вычисление, эпилог. В переменную указатель на функцию помещаем адрес и готово — можно вызывать. Главное — соответствие прототипа. Перевод в машинный код — это по сути компилятор, самое сложное в данной задаче. Для простых выражений сравнительно нетрудно, но когда упираемся в ограничения архитектуры то приходится усложнить, например, сохранять в стек промежуточные этапы.
-
Фантом
- Сообщения: 462
- ОС: openSUSE
Re: Вынести табличные данные за код программы.
Берите в качестве встраиваемого языка Lua. Он состоит из работы с таблицами чуть менее, чем полностью.
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Вынести табличные данные за код программы.
добавлю и про упомянутый мною (после lua) scheme: он состоит из работы с таблицами[*] гораздо более, чем полностью·
[*] что есть список? таблица!
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
diesel
- Бывший модератор
- Сообщения: 5989
- ОС: OS X, openSuSE, ROSA, Debian
Re: Вынести табличные данные за код программы.
sciko писал(а): ↑29.04.2012 20:15Сейчас собственно так и сделано. Но что писать в отдельный бинарник, что писать вкомпиленний в код массив разница невелика: править сложно.
В идеале хотелось бы, чтобы читался текстовый файл и по его данным создавалась бы функция от одной до трёх переменных. Но на С создать функцию в ходе выполнения невозможно.
А зачем вам создание функций в ходе выполнения? Насколько я понимаю задачу, у вас есть формула(или много формул), часть переменных которой видимо задается пользователем, а часть - табличные значения. При этом табличные значения, сами по себе - по-сути являются функциями, в математическом смысле, просто заданными таблично. Вот и сделайте функции, каждая из которых может искать в одном конкретном месте, и вполне в курсе того как это делать.
Если формат таблиц примерно один и тот же, например csv файлы с соответствующими хэдерами, то по-сути может быть много мелких функций, которые вполне в курсе того что им нужно найти, где и по каким критериям, и один большой "поисковик", который получает критерии поиска(читай "значения хэдеров csv-файла", то есть те самые "диаметр", "время"), соответствующие им величины, ну, и, возможно, имена полей в которых находится искомый результат(результаты), и отдает то что просили.
Конечно, в случае если "мелкие" функции можно было бы сгенерировать, или, наоборот, если что-то типа рубишного method missing, когда зовешь несуществующую функцию, а она выдает вполне конкретный результат, основываясь на том что и как позвал - это красивше, как идея. Но все же, можно и без этого. Тем более что вы вполне знаете что вам понадобится, как оно представлено итп, то есть основные функции/формулы вы на ходу не конструируете, и неизвестных значений, подставляемых в неизвестные формулы у вас не появляется в рантайме.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вынести табличные данные за код программы.
ИМХО это и не нужно. В большинстве случаев лексемы довольно большие, и оверхед в С несущественный (можно использовать например массив указателей на функции, который индексировать хешем лексемы). В С++ удобно использовать вируальные функции (на самом деле, это тот же массив указателей на функции, просто с "сахаром").
NickLion писал(а): ↑01.05.2012 11:19По-сути это JIT компиляция. Парсится выражение, строится дерево вычислений, упрощается, если это возможно (вычисляются константные выражения, к примеру), а потом переводится в машинный код, оформляется в виде функции — пролог, вычисление, эпилог. В переменную указатель на функцию помещаем адрес и готово — можно вызывать.
1. это грязный хак. (ибо не нужно выполнять данные).
2. это даст копеечный выигрыш.
3. сегодня это будет работать, а завтра это станет настолько долго, что съест этот ваш копеечный выигрыш. Проблема в том, что ваш компилятор не в курсе, что за команды появятся завтра.
diesel писал(а): ↑01.05.2012 18:23Конечно, в случае если "мелкие" функции можно было бы сгенерировать, или, наоборот, если что-то типа рубишного method missing, когда зовешь несуществующую функцию, а она выдает вполне конкретный результат, основываясь на том что и как позвал - это красивше, как идея.
в C несложно взять маленький хеш от лексемы (например в 1 байт), и составить таблицу (к примеру в 256 указателей на функции), причём (почти)каждая лексема будет иметь уникальный хеш, а ненужные дырки в таблице мы можем забить дефолтной функцией.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Вынести табличные данные за код программы.
возможно, что оптимальным вариантом будет что-то похожее на SQL язык (это НЕ относится никак к СУБД, базы данных - это другое. У вас УЖЕ есть какие-то таблицы, и вам только требуется язык их обработки. Я НЕ предлагаю писать что-то типа MySQL, я предлагаю обратить внимание на синтаксис SQL запросов)
вообще-то эти языки самодостаточны, и таблицы/списки там - часть языка. Не думаю, что такой синтаксис будет более удобен. Хотя конечно зависит от задачи (и от знания этого синтаксиса, тем, кто будет это реализовывать.)
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: Вынести табличные данные за код программы.
вообще-то в мои слова закралась небольшая ошибка — вместо 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: Вынести табличные данные за код программы.
drBatty писал(а): ↑02.05.2012 11:02diesel писал(а): ↑01.05.2012 18:23Конечно, в случае если "мелкие" функции можно было бы сгенерировать, или, наоборот, если что-то типа рубишного method missing, когда зовешь несуществующую функцию, а она выдает вполне конкретный результат, основываясь на том что и как позвал - это красивше, как идея.
в C несложно взять маленький хеш от лексемы (например в 1 байт), и составить таблицу (к примеру в 256 указателей на функции), причём (почти)каждая лексема будет иметь уникальный хеш, а ненужные дырки в таблице мы можем забить дефолтной функцией.
а способ получения функций, на которые вы будете делать указатели?
-
Crazy
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
Re: Вынести табличные данные за код программы.
за то можно сделать модуль, который в зависимости от того чем его инициализируешь, будет выполнять соответствующие действия.
1, 2, 3 параметра? запихни все передаваемые значения в вектор, и передай вектор, тогда будет функция от 2 переменных вектора и размера вектора.
Desipere in loco