2016-02-15 3 views
13

Я пытаюсь создать приложение Qt, и мне нужен оценщик математического выражения для оценки таких вещей, например, (4 + 5) * 2-9/3. Я включил файл .hpp этой библиотеки (http://www.partow.net/programming/exprtk/) для моего проекта в Qt Creator и попытался запустить следующий пример кода:Оценить математическое выражение в Qt

#include <cstdio> 
#include <string> 
#include "exprtk.hpp" 

int main() 
{ 
    typedef exprtk::expression<double> expression_t; 
    typedef exprtk::parser<double>   parser_t; 

    std::string expression_string = "3 + sqrt(5) + pow(3,2) + log(5)"; 

    expression_t expression; 

    parser_t parser; 

    if (parser.compile(expression_string,expression)) 
    { 
    double result = expression.value(); 

    printf("Result: %19.15\n",result); 
    } 
    else 
    printf("Error in expression\n."); 

    return 0; 
} 

Когда я пытаюсь скомпилировать и запустить его, я получаю следующий результат :

debug\main.o:-1: error: too many sections (62303) 

В чем проблема?

+0

строка 'Е («Результат:% 19,15 \ п», результат);' должен быть 'Е (" Результат:% 19,15 f \ n ", result);' – bibi

+0

какой компилятор/os вы используете? – bibi

+0

возможно это поможет: http://stackoverflow.com/a/31907912/2743307 – bibi

ответ

3

Используя только чистый Qt вы можете сделать что-то вроде этого:

QString expression_string("3 + sqrt(5) + pow(3,2) + log(5)"); 
QScriptEngine expression; 
double my_val=expression.evaluate(expression_string).toNumber(); 

вы можете сделать гораздо больше, см HERE и HERE

1

На самом деле, на моей машине (Qt 5.5, Ubuntu 16.04 с г ++ 5.3), код выше не работает.

Несмотря на то, что ответ довольно старый, я ставлю свое решение на случай, если кто-то найдет его полезным.

QScriptEngine использует синтаксис JavaScript. Таким образом, чтобы вышеприведенный код будет работать, я должен был изменить синтаксис:

QString expression_string("3 + Math.sqrt(5) + Math.pow(3,2) + Math.log(5)"); 
QScriptEngine expression; 
double my_val=expression.evaluate(expression_string).toNumber(); 
Смежные вопросы