crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> Реализация анализатора (парсера) формул времени выполнения
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  


Цитата(SABROG @ 9.3.2009, 16:11) *
Как по скорости?

на первый взгляд не плохо, наднях обязательно отпишусь... :rolleyes:

Цитата(BRE @ 9.3.2009, 17:24) *
Для сложения/умножения не принципиально. :)

:rolleyes: спасибо еще раз !!!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.3.2009, 20:32
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AntonTatu @ 9.3.2009, 18:59) *
Цитата(SABROG @ 9.3.2009, 16:11) *
Как по скорости?

на первый взгляд не плохо, наднях обязательно отпишусь... :rolleyes:

Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз.
Раскрывающийся текст

#include <stack>

class MathStack
{              
public:        
        void   push( double var);
        double pop ();          

private:
        std::stack<double> m_stack;
};                                

void MathStack::push( double var )
{                                
        m_stack.push( var );      
}                                

double MathStack::pop()
{                      
        double val = m_stack.top();
        m_stack.pop();            
        return val;                
}

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 9.3.2009, 20:36
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(BRE @ 9.3.2009, 20:32) *
Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз.

Кстати, а почему так? С чем это связано?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 9.3.2009, 20:46
Сообщение #6


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(AD @ 9.3.2009, 20:36) *
Цитата(BRE @ 9.3.2009, 20:32) *
Погонял тесты, при замене QStack на std::stack, получил увеличение производительности больше чем в 12 раз.

Кстати, а почему так? С чем это связано?

Пока не разбирался, сам в недоумении. :blink:
Будем посмотреть... :)

Посмотрел.
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  


Цитата(BRE @ 9.3.2009, 20:46) *
..получил увеличение производительности больше чем в 12 раз.


А что нужно сделать что бы переделать
Вот этот кусочек

f.addOp( new VarOp( &arr[ 0 ][ 4 ] ) );
f.addOp( new VarOp( &arr[ 3 ][ 7 ] ) );
f.addOp( new VarOp( &arr[ 7 ][ 1 ] ) );


на
на такой

f.addOp( new VarOp( &arr[ 0 ][ j ] ) );
f.addOp( new VarOp( &arr[ 3 ][ j ] ) );
f.addOp( new VarOp( &arr[ 7 ][ j ] ) );



т.е. необходимо создать формулу, посчитать ее,
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  


Цитата(AntonTatu @ 10.3.2009, 12:49) *
т.е. что бы появилась возможность "сдвигать" формулу и, не перестраивая формулу заново и не генерируя новый массив ?

Ну барин ты задачки задаешь. (с) :)

Переделать операцию VarOp или сделать еще одну операцию (это набросок).
class VectorVarOp : public Oparation
{
public:
    VectorVarOp( const Vector &vec );

    void    run();
    void    setIndex( int i, int j );

private:
    Vector    &m_vector;
    int         m_i;
    int         m_j;
};

VectorVarOp::VectorVarOp( const Vector &vec )
    : m_vector( vec ), m_i( 0 ), m_j( 0 )
{
}

void VectorVarOp::run()
{
    m_stack.push( m_vector[ m_i ][ m_j ] );
}

void VectorVarOp::setIndex( int i, int j )
{
    m_i = i;
    m_j = j;
}

Таким образом можно наделать разных необходимых операций, ввести переменные и т.д.
Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции.
Думай пробуй. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AntonTatu
  опции профиля:
сообщение 10.3.2009, 23:38
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 48
Регистрация: 27.11.2008
Пользователь №: 437

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(BRE @ 10.3.2009, 20:46) *
Ну барин ты задачки задаешь. (с) :)
.............................................
.............................................
Таким образом можно наделать разных необходимых операций, ввести переменные и т.д.
Например, если у всех переменных необходимо изменять j, можно сделать такую операцию, которая это будет делать вызовом одной функции.
Думай пробуй. :)


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

void AddOp::run()
{
    int v1 = m_stack.pop();
    int v2 = m_stack.pop();
    m_stack.push( v1 + v2 );
}

double Formula::calc() const
{
    // Выполнить все операции
    for( ListOp::ConstIterator iOp = m_ops.begin(); iOp != m_ops.end(); ++iOp ){
        (*iOp)->run();
    }
    // После выполнения на вершине арифметического стека результат
    return Operation::m_stack.pop();


как сделать так что бы при сложении если на стеке ( m_stack.push( v1 + v2 );) число больше ну к примеру 100 (или любого какое нравится) остановить подсчет Formula::calc() и вывести результат ?
я сделал так....
вот


//изменил этот класс так 
class Operation
{
public:
    virtual void  run() = 0;    //выполнить операцию
    virtual bool  exit() = 0;   //добавил проверку на выход

//изменил этот класс так
class VarOp : public Operation
{
public:
    VarOp( int *var  );

    void    run();
    bool    exit();

//изменил этот класс так
class AddOp : public Operation
{
public:
    void    run();
    bool    exit();
    bool flag;

//...............................................
void AddOp::run()
{
    int v1 = m_stack.pop();
    int v2 = m_stack.pop();
    m_stack.push( v1 + v2 );
    if (v1 >= 1) flag = false;
}


bool AddOp::exit()
{
   if (flag == false)
   {
       return false;
   }else
   {
    return true;
   }
}

//изменил этот класс так
double Formula::calc() const
{
    // Выполнить все операции
    for( ListOp::ConstIterator iOp = m_ops.begin(); iOp != m_ops.end(); ++iOp ){
        (*iOp)->run();
        if (!(*iOp)->exit()) {
            break;


все работает как надо, но мне кажется что можно было както проще сделать ?

Сообщение отредактировал AntonTatu - 11.3.2009, 0:21
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме
- AntonTatu   Реализация анализатора (парсера) формул времени выполнения   4.3.2009, 17:56
- - kuler   если в студии, то там всего лишь надо указать тип ...   4.3.2009, 18:13
- - Litkevich Yuriy   Цитата(AntonTatu @ 4.3.2009, 20:56) а вот...   4.3.2009, 18:24
- - SABROG   Можно таскать вместе с программой MinGW Зачем ...   4.3.2009, 18:26
- - ViGOur   SABROG, думаю твой пост не к месту. Просто есть ...   4.3.2009, 18:31
|- - SABROG   Цитата(ViGOur @ 4.3.2009, 18:31) SABROG, ...   4.3.2009, 18:42
|- - AntonTatu   Цитата(ViGOur @ 4.3.2009, 18:31) Человеку...   4.3.2009, 20:25
|- - trdm   Цитата(AntonTatu @ 4.3.2009, 20:25) Попро...   4.3.2009, 21:32
||- - AntonTatu   [/quote] QtScript - для того, чтобы скрипты ИСПОЛН...   4.3.2009, 21:55
||- - trdm   Цитата(AntonTatu @ 4.3.2009, 21:55) Цитат...   4.3.2009, 23:10
||- - AntonTatu   Цитатанормальное замечание. не знаю. если верить ...   4.3.2009, 23:42
|- - trdm   Цитата(AntonTatu @ 4.3.2009, 20:25) PS: Ф...   5.3.2009, 9:54
- - trdm   А я вообще не врубился в "генерирует формулу...   4.3.2009, 19:38
- - Admin   SABROG, перечитал твое сообщение, и решил извинить...   4.3.2009, 20:32
- - Litkevich Yuriy   AntonTatu, а QtScript тебе для этих целей тоже не ...   4.3.2009, 20:40
|- - AntonTatu   Цитата(Litkevich Yuriy @ 4.3.2009, 20:40)...   4.3.2009, 21:04
- - ViGOur   Цитата(AntonTatu @ 4.3.2009, 21:04) а ...   4.3.2009, 21:10
- - SABROG   Цитата(AntonTatu @ 4.3.2009, 20:25) Форму...   5.3.2009, 0:33
- - Константин   потому, что компилятор предназначен для компилиров...   5.3.2009, 0:47
- - Litkevich Yuriy   Цитата(AntonTatu @ 5.3.2009, 0:55) А что ...   5.3.2009, 8:19
|- - AntonTatu   Цитата(Litkevich Yuriy @ 5.3.2009, 8:19) ...   6.3.2009, 0:07
|- - BRE   Цитата(AntonTatu @ 6.3.2009, 0:07) я так ...   6.3.2009, 7:52
- - BRE   Пример: array2d.h #ifndef __ARRAY2D #define __ARR...   6.3.2009, 9:29
|- - BRE   Цитата(BRE @ 6.3.2009, 9:29) Пример: arr...   6.3.2009, 10:03
|- - Гость_AntonTatu_*   ЦитатаВысокой скорости вычисления от скриптов ожид...   6.3.2009, 12:11
|- - BRE   Цитата(Гость_AntonTatu_* @ 6.3.2009, 12:1...   6.3.2009, 12:26
|- - AntonTatu   Цитата(BRE @ 6.3.2009, 12:26) Цитата(Гост...   6.3.2009, 12:34
|- - BRE   Цитата(AntonTatu @ 6.3.2009, 12:34) все н...   6.3.2009, 12:39
|- - BRE   Цитата(AntonTatu @ 6.3.2009, 12:34) форму...   6.3.2009, 19:05
|- - AntonTatu   ЦитатаИсходя из этого сообщения, я не представляю ...   6.3.2009, 21:19
|- - BRE   Цитата(AntonTatu @ 6.3.2009, 21:19) Алгор...   6.3.2009, 21:31
|- - AntonTatu   Цитата(BRE @ 6.3.2009, 21:31) 4. запускае...   7.3.2009, 0:23
|- - BRE   Цитата(AntonTatu @ 7.3.2009, 0:23) подума...   7.3.2009, 10:18
|- - AntonTatu   ЦитатаКак с этим закончим, можно будет попробовать...   9.3.2009, 2:24
|- - BRE   Цитата(AntonTatu @ 9.3.2009, 2:24) main.o...   9.3.2009, 10:27
|- - AntonTatu   ЦитатаПокажи, что сейчас получилось... Прежде вс...   9.3.2009, 13:35
|- - BRE   Цитата(AntonTatu @ 9.3.2009, 13:35) stat...   9.3.2009, 13:50
|- - AntonTatu   Цитата(BRE @ 9.3.2009, 13:50) В исходник ...   9.3.2009, 16:06
- - trdm   Может быть ассемблер? Данные то все числовые, ком...   6.3.2009, 16:34
- - SABROG   Тогда можно глянуть на fasmlib.   6.3.2009, 17:01
- - SABROG   Я так понял, что у него проблема с тем, что в рант...   6.3.2009, 20:24
|- - BRE   Цитата(SABROG @ 6.3.2009, 20:24) Я так по...   6.3.2009, 20:44
- - Litkevich Yuriy   Цитата(AntonTatu @ 9.3.2009, 16:35) выраж...   9.3.2009, 14:03
- - SABROG   Как по скорости?   9.3.2009, 16:11
|- - AntonTatu   Цитата(SABROG @ 9.3.2009, 16:11) Как по с...   9.3.2009, 18:59
|- - BRE   Цитата(AntonTatu @ 9.3.2009, 18:59) Цитат...   9.3.2009, 20:32
|- - AD   Цитата(BRE @ 9.3.2009, 20:32) Погонял тес...   9.3.2009, 20:36
|- - BRE   Цитата(AD @ 9.3.2009, 20:36) Цитата(BRE ...   9.3.2009, 20:46
|- - AntonTatu   Цитата(BRE @ 9.3.2009, 20:46) ..получил у...   10.3.2009, 12:49
|- - BRE   Цитата(AntonTatu @ 10.3.2009, 12:49) т.е....   10.3.2009, 20:46
|- - AntonTatu   Цитата(BRE @ 10.3.2009, 20:46) Ну барин т...   10.3.2009, 23:38
|- - BRE   Мне кажется, что логичней, если сам метод run() бу...   11.3.2009, 6:12
|- - AntonTatu   Цитата(BRE @ 11.3.2009, 6:12) Мне кажется...   11.3.2009, 11:09
|- - BRE   Цитата(AntonTatu @ 11.3.2009, 11:09) //Оч...   11.3.2009, 11:31
- - BRE   Еще небольшое уточнение, насчет операций вычитания...   9.3.2009, 17:24
- - Litkevich Yuriy   Ребята подумайте как переименовать тему, я ее чита...   9.3.2009, 20:56
- - SABROG   Цитата(BRE @ 9.3.2009, 20:46) Посмотрел. ...   10.3.2009, 20:21
- - Litkevich Yuriy   Цитата(SABROG @ 10.3.2009, 23:21) Хорошо ...   10.3.2009, 20:24
|- - SABROG   Цитата(Litkevich Yuriy @ 10.3.2009, 20:24...   10.3.2009, 20:29
- - BRE   Добавил контексты. Разбил по файлам. Кратко докуме...   11.3.2009, 21:44
- - AntonTatu   Цитата(BRE @ 11.3.2009, 21:44) Добавил ко...   11.3.2009, 21:52
- - BRE   Цитата(AntonTatu @ 11.3.2009, 21:52) ЗЫ: ...   11.3.2009, 23:17


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


11 чел. читают эту тему (гостей: 11, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.1.2025, 3:45