Реализация анализатора (парсера) формул времени выполнения |
Здравствуйте, гость ( Вход | Регистрация )
Реализация анализатора (парсера) формул времени выполнения |
AntonTatu |
4.3.2009, 17:56
Сообщение
#1
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Всем привет !
Вопрос в следующем, имеется прога которая генерирует некоторую формулу (формула меняет количество своих параметров в зависимости от исходных значений в программе ), в этой же проге есть массив который использует полученную формулу в дальнейших расчетах, хочется создать из формулы dll ку и потом ее вызывать в нужном месте программы, как это сделать? С вызовом полученной dll я вроде бы разобрался, а вот как научить прогу генерить dll ку понять не могу. ЗЫ: Какие можно использовать компилятор/линковщик (минимум занимаемого места, требуемых для работы файлов, потдержка STL требуется) Выручайте ! Спасибо ! |
|
|
SABROG |
9.3.2009, 16:11
Сообщение
#2
|
Профессионал Группа: Участник Сообщений: 1207 Регистрация: 8.12.2008 Из: Russia, Moscow Пользователь №: 446 Спасибо сказали: 229 раз(а) Репутация: 34 |
Как по скорости?
|
|
|
AntonTatu |
9.3.2009, 18:59
Сообщение
#3
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
|
|
|
BRE |
9.3.2009, 20:32
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Как по скорости? на первый взгляд не плохо, наднях обязательно отпишусь... Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз. Раскрывающийся текст
|
|
|
AD |
9.3.2009, 20:36
Сообщение
#5
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
|
|
|
BRE |
9.3.2009, 20:46
Сообщение
#6
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз. Кстати, а почему так? С чем это связано? Пока не разбирался, сам в недоумении. Будем посмотреть... Посмотрел. QStack построен на базе QVector, и при добавлении/удалении элемента постоянно делает resize вектора. std::stack построен на std::deque, соответственно скорость добавления/удаления на высоте. Сообщение отредактировал BRE - 9.3.2009, 22:20 |
|
|
AntonTatu |
10.3.2009, 12:49
Сообщение
#7
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
..получил увеличение производительности больше чем в 12 раз. А что нужно сделать что бы переделать Вот этот кусочек
на на такой
т.е. необходимо создать формулу, посчитать ее, j=0; f.addOp( new VarOp( &arr[ 0 ][ j ] ) ); f.addOp( new VarOp( &arr[ 3 ][ j ] ) ); f.addOp( new VarOp( &arr[ 7 ][ j ] ) ); res = f.calc(); передвинуться на следующий j -й столбец массива arr, посчитать, j : =j+1; res = f.calc(); на следующий.. j : =j+1; res = f.calc(); и т.д. т.е. что бы появилась возможность "сдвигать" формулу и, не перестраивая формулу заново и не генерируя новый массив ? Сообщение отредактировал AntonTatu - 10.3.2009, 17:36 |
|
|
BRE |
10.3.2009, 20:46
Сообщение
#8
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
т.е. что бы появилась возможность "сдвигать" формулу и, не перестраивая формулу заново и не генерируя новый массив ? Ну барин ты задачки задаешь. (с) Переделать операцию VarOp или сделать еще одну операцию (это набросок).
Таким образом можно наделать разных необходимых операций, ввести переменные и т.д. Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции. Думай пробуй. |
|
|
AntonTatu |
10.3.2009, 23:38
Сообщение
#9
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ну барин ты задачки задаешь. (с) ............................................. ............................................. Таким образом можно наделать разных необходимых операций, ввести переменные и т.д. Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции. Думай пробуй. Да у самого голова уже пухнет , залез в такие дебри в которых мало что понимаю Последний вопрос связанный вот с этим , и все.... вот эта часть
как сделать так что бы при сложении если на стеке ( m_stack.push( v1 + v2 ) число больше ну к примеру 100 (или любого какое нравится) остановить подсчет Formula::calc() и вывести результат ? я сделал так.... вот
все работает как надо, но мне кажется что можно было както проще сделать ? Сообщение отредактировал AntonTatu - 11.3.2009, 0:21 |
|
|
BRE |
11.3.2009, 6:12
Сообщение
#10
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Мне кажется, что логичней, если сам метод run() будет сообщать нужно ли продолжать вычисления.
вот
Еще желательно ввести методы для очистки стека, т.к. при таком прерывании операции возможны случаи, когда в стеке останутся данные. Можно ввести такое понятие как контекст, в котором хранить арифметический стек, состояние (ошибка), исходные данные, локальные переменные. Тогда мы бы избавились от статического стека и получили возможность пихать расчет формул по разным потокам. Если будут еще вопросы задавай, мне самому интересен этот вопрос. Сообщение отредактировал BRE - 11.3.2009, 8:39 |
|
|
AntonTatu |
11.3.2009, 11:09
Сообщение
#11
|
Студент Группа: Участник Сообщений: 48 Регистрация: 27.11.2008 Пользователь №: 437 Спасибо сказали: 0 раз(а) Репутация: 0 |
Мне кажется, что логичней, если сам метод run() будет сообщать нужно ли продолжать вычисления. Так и знал что можно было огород не городить......с флажком... Цитата Еще желательно ввести методы для очистки стека, т.к. при таком прерывании операции возможны случаи, когда в стеке останутся данные. сделал так: вот
Если выход из цикла будет по break, то в стэке будет какой то результат, но в этом случае очищать его мне ненужно, т.к., я его в дальнейшем использую... (мне его наооборот получать нужно ) Цитата Можно ввести такое понятие как контекст, в котором хранить арифметический стек, состояние (ошибка), исходные данные, локальные переменные. Тогда мы бы избавились от статического стека и получили возможность пихать расчет формул по разным потокам. Если будут еще вопросы задавай, мне самому интересен этот вопрос. вот это очень интересно, т.к. скорости мне все равно хочется больше... (если компилировать dll ку с массивом получается намного быстре, только компилятор таскать за собой не получится...) |
|
|
Текстовая версия | Сейчас: 30.1.2025, 3:33 |