Реализация анализатора (парсера) формул времени выполнения |
Здравствуйте, гость ( Вход | Регистрация )
Реализация анализатора (парсера) формул времени выполнения |
AntonTatu |
4.3.2009, 17:56
Сообщение
#1
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем привет !
Вопрос в следующем, имеется прога которая генерирует некоторую формулу (формула меняет количество своих параметров в зависимости от исходных значений в программе ), в этой же проге есть массив который использует полученную формулу в дальнейших расчетах, хочется создать из формулы dll ку и потом ее вызывать в нужном месте программы, как это сделать? С вызовом полученной dll я вроде бы разобрался, а вот как научить прогу генерить dll ку понять не могу. ЗЫ: Какие можно использовать компилятор/линковщик (минимум занимаемого места, требуемых для работы файлов, потдержка STL требуется) Выручайте ! Спасибо ! |
|
|
BRE |
6.3.2009, 9:29
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Пример:
array2d.h
array2d.cpp
main.cpp
Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться). |
|
|
BRE |
6.3.2009, 10:03
Сообщение
#3
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Пример:
array2d.h
array2d.cpp
main.cpp
Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться). |
|
|
Гость_Гость_AntonTatu_*_* |
6.3.2009, 12:11
Сообщение
#4
|
Гости |
Цитата Высокой скорости вычисления от скриптов ожидать не стоит (от нативной она будет сильно отличаться). спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально ) |
|
|
BRE |
6.3.2009, 12:26
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально ) Уточни, из каких операций будет состоять формула (+ - * /)? Или будут еще какие-то функции? Опиши подробней. Ты используешь 2-мерный массив, это не изображение часом, а формула - не фильтр ли? |
|
|
AntonTatu |
6.3.2009, 12:34
Сообщение
#6
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
спасибо, так то же попробывал..., очень медленно в 1000 раз на глазок если, вобщем вопрос не снят, каким образом можно из проги получать код и компилить его "нативно"....? я уже весь инет перелазил, ну не писать же собственный компилятор.... (для меня это не реально ) Уточни, из каких операций будет состоять формула (+ - * /)? Или будут еще какие-то функции? Опиши подробней. Ты используешь 2-мерный массив, это не изображение часом, а формула - не фильтр ли? все намного про ще, генерится специальным образом массив, считается формула такого вида: x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+..... формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... |
|
|
BRE |
6.3.2009, 19:05
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
формула считается в цикле, с каждой итерацией формула новая, ее длинна то же может изменится..., переменные в формуле это значения разных ячеек массива, на выходе каждой итерации необходимо получить расчетное значение итой формулы, колличество прогонов (итераций) миллионы.... Исходя из этого сообщения, я не представляю реализацию с dll. Алгоритм: Рассчитали и заполнили массив с переменными; for( миллион итераций ) { Получили строку с формулой; Сгенерировали исходный файл (не важно С/asm); Запустили компилятор; Дождались завершения компиляции; Запустили линкер; Дождались завершения линковки; Загрузили dll; Resolve функцию; Выполнили функцию; Вернули результат; } Тебе не кажется, что время исполнения это цикла будет значительно больше чем выполнения того же скрипта на QtScript? А я так понял, что его скорость тебя уже не устраивает. Как генерируется сама формула? Обьясни по-подробней, чувствую все можно сделать проще и не такими экзотическими способами. |
|
|
AntonTatu |
6.3.2009, 21:19
Сообщение
#8
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата Исходя из этого сообщения, я не представляю реализацию с dll. Я дико извиняюсь, ввел всех в заблуждение (сижу понять не могу фигню какую то написал в предыдущем своем посте), правильно так: Алгоритм: 1. Считается формула такого вида: x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+..... формула может быть разной в зависимости от задачи (разной длинны, с разным количеством переменных, но структура именно такая как показано 2. Из формулы генерится dll в цикле (100000 раз){ 2. Генерится специальным образом массив, ячеек в массиве столько сколько переменных x[переменная,j] в формуле 3. формула высчитывается по массиву (подготовленной dll) 4. Записывается ответ } ЗЫ: понял почему фигню написал, голова была занята тем как считать не всю формулу сразу, а почастям... (хотя с этим разобрался) Теперь алгоритм верный, может у кого рнибудь есть предложения , куда "копать" ? Сообщение отредактировал AntonTatu - 6.3.2009, 21:25 |
|
|
BRE |
6.3.2009, 21:31
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Алгоритм: 1. Считается формула такого вида: x[0,j]*x[2,j]*x[5,j]*x[10,j]+x[0,j]*x[3,j]*x[4,j]+N+..... формула может быть разной в зависимости от задачи (разной длинны, с разным количеством переменных, но структура именно такая как показано 2. Из формулы генерится dll в цикле (100000 раз){ 2. Генерится специальным образом массив, ячеек в массиве столько сколько переменных x[переменная,j] в формуле 3. формула высчитывается по массиву (подготовленной dll) 4. Записывается ответ } Ага. Как вариант: 1. Считается формула 2. Распарсивается в обратную польскую, только место конкретных чисел храняться ссылки на соответствующие элементы в массиве. в цикле (100000 раз) { 3. Генерится специальным образом массив, ячеек в массиве столько сколько переменных x[переменная,j] в формуле 4. запускается расчет формулы (место ссылок на элементы подставляются значения из массива) 5. Записывается ответ } Т.е. сначала готовим формулу для быстрого вычисления. |
|
|
AntonTatu |
7.3.2009, 0:23
Сообщение
#10
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
4. запускается расчет формулы (место ссылок на элементы подставляются значения из массива) я вот этот пункт понять не могу, есть у меня формула (строка типа QString), преобразовал я ее в обратную польскую, (это значит распарсил ?), а что значит "в место ссылок на элементы подставляются значения из массива" ? я просто не понимаю, если я формулу преобразовал в обратную польскую на выходе тоже ж QString ? просто я итак могу формулу разобрать считывая строчку слево на право (без польской нотации), смотреть индекс переменных и сверяясь с ячейками массива считать функцию, но этот способ медленный (не быстрее чем с помощью QScript) подумал еще , а может как вариант создать класс (структуру) в котором хранить переменные функции, ссылки на ячейки массива и знак (+ или *) следуемый за переменной , и запихать все это в односвязаный список, делать обход списка от начала в конец и таким образом проводить расчет функции ? Сообщение отредактировал AntonTatu - 7.3.2009, 1:07 |
|
|
BRE |
7.3.2009, 10:18
Сообщение
#11
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
подумал еще , а может как вариант создать класс (структуру) в котором хранить переменные функции, ссылки на ячейки массива и знак (+ или *) следуемый за переменной , и запихать все это в односвязаный список, делать обход списка от начала в конец и таким образом проводить расчет функции ? +1 Парсер переводит математическую формулу в список необходимых операций. Делаем класс стек выполнений:
Вводим виртуальный базовый класс для всех операций:
Вводим класс формулу (список операций):
Теперь, формула A + B * C + D в обратной польской нотации будет: ABC*+D+ Для примера: A - arr[ 0 ][ 4 ]; B - arr[ 3 ][ 7 ]; C - arr[ 7 ][ 1 ]; D - arr[ 4 ][ 8 ];
Как с этим закончим, можно будет попробовать оптимизировать. |
|
|
AntonTatu |
9.3.2009, 2:24
Сообщение
#12
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Цитата Как с этим закончим, можно будет попробовать оптимизировать. Третий день сижу, что то не побороть никак, ------ Построение начато: проект: one, Конфигурация: Debug Win32 ------ Компиляция... main.cpp Компоновка... main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: void __thiscall MathStack::push(double)" (?push@MathStack@@QAEXN@Z) в функции "public: virtual void __thiscall VarOp::run(void)" (?run@VarOp@@UAEXXZ) main.obj : error LNK2001: неразрешенный внешний символ ""protected: static class MathStack Operation::m_stack" (?m_stack@Operation@@1VMathStack@@A)" C:\Documents and Settings\Anton\Мои документы\Visual Studio 2008\Projects\one\Debug\one.exe : fatal error LNK1120: 2 неразрешенных внешних элементов Журнал построения был сохранен в "file://c:\Documents and Settings\Anton\Мои документы\Visual Studio 2008\Projects\one\one\Debug\BuildLog.htm" one - ошибок 3, предупреждений 0 ========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ========== Переписал вот что :
и
но это что называется в глаза бросилось... а ошибки все равно сыплет... Сообщение отредактировал AntonTatu - 9.3.2009, 2:27 |
|
|
Текстовая версия | Сейчас: 30.1.2025, 3:46 |