Передача функции через строку

Модератор: Модераторы разделов

Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Передача функции через строку

Сообщение AsMasteR »

Нужно совершить вот такое вот непотребство:

Код: Выделить всё

#include <stdio.h>
int main(void)
{
double a,b,c;
char formula [100];
a=5;
b=4;
formula="a*b";
c=double(formula);
return 0;
}

Это чисто cхематическое изложение моих мыслей. А вот как такое написать на си?
Мне нужно с формулами работать как со строками, а потом вычислять.
Заранее благодарен всем советам
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Передача функции через строку

Сообщение drBatty »

AsMasteR писал(а):
02.04.2009 17:42
А вот как такое написать на си?
Мне нужно с формулами работать как со строками, а потом вычислять.
Заранее благодарен всем советам

Это классическая задача. На Си - читать K&R
А просто про эту задачу - Д.Кнут
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
serzh-z
Бывший модератор
Сообщения: 8259
Статус: Маньяк
ОС: Arch, Fedora, Ubuntu

Re: Передача функции через строку

Сообщение serzh-z »

AsMasteR
Встроенных возможностей выполнять динамический код в Си нет, но можно попробовать использовать существующий интерпретатор какого-нибудь скриптового языка. Скажем для JavaScript. Либо писать парсер.
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

Дональда Кнута давно уже читал, было помню.. дык там алгоритмы, а алгоритм я вроде вверху написал, мне синтаксис нужен. А K&R не что иное как спецификация (если ошибаюсь, прошу прощенья)..
Нет, я конечно могу ассемблерную вставку сделать, но неудобно будет.

serzh-z писал(а):
02.04.2009 18:10
AsMasteR
Встроенных возможностей выполнять динамический код в Си нет, но можно попробовать использовать существующий интерпретатор какого-нибудь скриптового языка. Скажем для JavaScript. Либо писать парсер.

Я пишу динамическую библиотеку, скриптовый язык здесь не выход.. к сожалению.
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Передача функции через строку

Сообщение BlackStar »

LightLang Team
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

2BlackStar
А какая связь между обратной польской записью, и обработкой строк? Поясни пожалуйста..
Я всё больше скланяюсь к мысли продуктивности ассемблерной вставки
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
MiK13
Сообщения: 1289
ОС: Linux Debian

Re: Передача функции через строку

Сообщение MiK13 »

AsMasteR писал(а):
02.04.2009 18:29
Я всё больше скланяюсь к мысли продуктивности ассемблерной вставки

А что может дать ассемблерная вставка такого, что не позволит сделать сам си?
Спасибо сказали:
Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Передача функции через строку

Сообщение BlackStar »

Формулу будет вычислить проще если перевести её в постфиксную нотацию.
LightLang Team
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

1. Нужна таблица соответствий переменных (лучше хеш, если такий много, если до 100 - отсортированный массив+дихотомия):
string --> double&
2. Используем стандартный рекурсивно-ниспадающий алгоритм разбора выражений
И все. Если надо - могу поискать у себя этот код, когда-то давно писал калькулятор выражений.
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

MiK13 писал(а):
02.04.2009 18:36
А что может дать ассемблерная вставка такого, что не позволит сделать сам си?

возможность выполнять динамический код
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

BlackStar писал(а):
02.04.2009 18:41
Формулу будет вычислить проще если перевести её в постфиксную нотацию.

Не намного, просто в случае разбора обычных выражений обычно используют рекурсию, а RPN - стек. Главный плюс RPN, который я вижу - отсутствие скобок, но минус - меньшая наглядность полного выражения. ( обычная нотация (3+5)*(7-8*(4-7)), обратная 3 5 + 7 8 4 7 - * - * )

AsMasteR писал(а):
02.04.2009 18:47
MiK13 писал(а):
02.04.2009 18:36
А что может дать ассемблерная вставка такого, что не позволит сделать сам си?

возможность выполнять динамический код

Я бы даже сказал - неконтролируемый динамический код. Не советую использовать.
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

NickLion писал(а):
02.04.2009 18:44
1. Нужна таблица соответствий переменных (лучше хеш, если такий много, если до 100 - отсортированный массив+дихотомия):
string --> double&
2. Используем стандартный рекурсивно-ниспадающий алгоритм разбора выражений
И все. Если надо - могу поискать у себя этот код, когда-то давно писал калькулятор выражений.

Если не трудно, код бы очень помог. В любом случае большое спасибо!
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

AsMasteR писал(а):
02.04.2009 17:42
Мне нужно с формулами работать как со строками, а потом вычислять.

AsMasteR писал(а):
02.04.2009 18:13
Нет, я конечно могу ассемблерную вставку сделать, но неудобно будет.
...
Я пишу динамическую библиотеку, скриптовый язык здесь не выход.. к сожалению.

AsMasteR писал(а):
02.04.2009 18:29
А какая связь между обратной польской записью, и обработкой строк?
...

хм... а какая связь между обработкой строк и ассемблерной вставкой? скриптовый язык между прочим ближе ;) и почему скриптовый язык противоречит динамической библиотеке?
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

хм... а какая связь между обработкой строк и ассемблерной вставкой? скриптовый язык между прочим ближе wink.gif и почему скриптовый язык противоречит динамической библиотеке?

Динамическая библиотека используется многократно, каждый раз компилировать скрипт - необоснованный расход процессорного времени.
связь с ассемблерной вставкой есть, но я скорее всего склонюсь к написанию соответствующей процедуры на си (по вашему прошу заметить рецепту :)
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

Найти код на C++ что-то не могу. Есть только написанный еще в школе на VB6. Давать? Или поискать? :)
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

NickLion писал(а):
02.04.2009 19:25
Найти код на C++ что-то не могу. Есть только написанный еще в школе на VB6. Давать? Или поискать? :)

Хватит и на VB :) (благо 13 синтаксисов знаю) Что за школа та такая была? я такие вещчи даж на городских олимпиадах не писал... не то что в школе..
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

AsMasteR писал(а):
02.04.2009 19:34
Хватит и на VB :) (благо 13 синтаксисов знаю) Что за школа та такая была? я такие вещчи даж на городских олимпиадах не писал... не то что в школе..

Ну, это не школа требовала, просто я тогда в школе был, а требовали как раз олимпиады. (Я знаю, что там не все оптимально, особенно там где имена функций, но суть думаю понятна). Одна и та же формула вызывалась многократно, поэтому разбитые токены для ускорения помещаются в массив. Аргумент - только x, но то уже детали. Коментариев по коду практически нет, поэтому тут и расписываю. Если что непонятно, отвечу.

PS а файл приложить забыл %) 7z не прикрепляет что-то, переименовал в rar

PPS
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Передача функции через строку

Сообщение kamre »

Простейший калькулятор на C++:

Код: Выделить всё

/*=============================================================================
    Copyright (c) 2002-2003 Joel de Guzman
    http://spirit.sourceforge.net/

    Use, modification and distribution is subject to the Boost Software
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
////////////////////////////////////////////////////////////////////////////
//
//  Full calculator example demonstrating Phoenix
//  This is discussed in the "Closures" chapter in the Spirit User's Guide.
//
//  [ JDG 6/29/2002 ]
//
////////////////////////////////////////////////////////////////////////////
#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_attribute.hpp>
#include <iostream>
#include <string>

////////////////////////////////////////////////////////////////////////////
using namespace std;
using namespace BOOST_SPIRIT_CLASSIC_NS;
using namespace phoenix;

////////////////////////////////////////////////////////////////////////////
//
//  Our calculator grammar using phoenix to do the semantics
//
//  Note:   The top rule propagates the expression result (value) upwards
//          to the calculator grammar self.val closure member which is
//          then visible outside the grammar (i.e. since self.val is the
//          member1 of the closure, it becomes the attribute passed by
//          the calculator to an attached semantic action. See the
//          driver code that uses the calculator below).
//
////////////////////////////////////////////////////////////////////////////
struct calc_closure : BOOST_SPIRIT_CLASSIC_NS::closure<calc_closure, double>
{
    member1 val;
};

struct calculator : public grammar<calculator, calc_closure::context_t>
{
    template <typename ScannerT>
    struct definition
    {
        definition(calculator const& self)
        {
            top = expression[self.val = arg1];

            expression
                =   term[expression.val = arg1]
                    >> *(   ('+' >> term[expression.val += arg1])
                        |   ('-' >> term[expression.val -= arg1])
                        )
               ;

            term
                =   factor[term.val = arg1]
                    >> *(   ('*' >> factor[term.val *= arg1])
                        |   ('/' >> factor[term.val /= arg1])
                        )
               ;

            factor
                =   ureal_p[factor.val = arg1]
                |   '(' >> expression[factor.val = arg1] >> ')'
                |   ('-' >> factor[factor.val = -arg1])
                |   ('+' >> factor[factor.val = arg1])
               ;
        }

        typedef rule<ScannerT, calc_closure::context_t> rule_t;
        rule_t expression, term, factor;
        rule<ScannerT> top;

        rule<ScannerT> const&
        start() const { return top; }
    };
};

////////////////////////////////////////////////////////////////////////////
//
//  Main program
//
////////////////////////////////////////////////////////////////////////////
int
main()
{
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "\t\tExpression parser using Phoenix...\n\n";
    cout << "/////////////////////////////////////////////////////////\n\n";
    cout << "Type an expression...or [q or Q] to quit\n\n";

    calculator calc;    //  Our parser

    string str;
    while (getline(cin, str))
    {
        if (str.empty() || str[0] == 'q' || str[0] == 'Q')
            break;

        double n = 0;
        parse_info<> info = parse(str.c_str(), calc[var(n) = arg1], space_p);

        //  calc[var(n) = arg1] invokes the calculator and extracts
        //  the result of the computation. See calculator grammar
        //  note above.

        if (info.full)
        {
            cout << "-------------------------\n";
            cout << "Parsing succeeded\n";
            cout << "result = " << n << endl;
            cout << "-------------------------\n";
        }
        else
        {
            cout << "-------------------------\n";
            cout << "Parsing failed\n";
            cout << "stopped at: \": " << info.stop << "\"\n";
            cout << "-------------------------\n";
        }
    }

    cout << "Bye... :-) \n\n";
    return 0;
}
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

[offtopic]
2 kamre
Только этот простейший калькулятор буст требует... Без этого вполне можно обойтись. Если буст уже используется - тогда ладно, а так - зачем?
[offtopic]
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

буст требует... Без этого вполне можно обойтись
Согласен. Матерьяла у меня уже хватает, осталось взять себя в руки и закодить всё енто..
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Передача функции через строку

Сообщение kamre »

NickLion писал(а):
02.04.2009 20:55
[offtopic]
Только этот простейший калькулятор буст требует... Без этого вполне можно обойтись. Если буст уже используется - тогда ладно, а так - зачем?
[offtopic]


Там только header-only часть из boost используется. А так можно и без STL обойтись и еще без много чего :)

Вообще удобнее же сразу грамматику с семантическими действиями описывать, а не программировать самому разбор через рекурсивный спуск. boost::spirit для такой несложной функциональности, как калькулятор выражений с переменными подходит почти идеально: есть таблица символов (как раз для маппинга var -> value), также можно легко построить дерево по выражению и уже вычислять значения по дереву.

Так что вполне можно написать подобную программу на достаточно выском уровне, а детали оставить библиотеке. Ну это, конечно, если нет аллергии к С++ шаблонам и boost.
Спасибо сказали:
Serg79
Сообщения: 153

Re: Передача функции через строку

Сообщение Serg79 »

AsMasteR, Ты такой бред здесь несешь. Особенно понравилось про ассемблерные вставки. :)
Подожди минут десять, я сейчас напишу Тебе простенький синтаксических анализаторов для простых выражений. ;)
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Передача функции через строку

Сообщение kamre »

Serg79 писал(а):
02.04.2009 21:33
AsMasteR, Ты такой бред здесь несешь. Особенно понравилось про ассемблерные вставки. :)


Идея про ассебмлер не такая уж и бредовая на самом деле, все зависит от постановки задачи :)

На rsdn как-то читал одну тему, где примерно похожая задача обсуждалась. Там выражения после разбора нужно было вычислять много-много раз. Поэтому парсер+интерпретатор на C++ проиграл варианту на C#+.NET, т.к. в последнем выражение компилировалось на лету в отдельную сборку и подключалось в рантайм, а уж JIT свое дело по оптимизации и генерации нативного кода сделал хорошо :)
Спасибо сказали:
Serg79
Сообщения: 153

Re: Передача функции через строку

Сообщение Serg79 »

AsMasteR, лови код. Надеюсь ума хватит его скомпилировать, все таки в городских олимпиадах участвовал ;)

Код: Выделить всё

%{
#include <stdio.h>
#include <ctype.h>

#define YYSTYPE int
static void yyerror(char *s);
static int yylex(void);
%}
%token NUMB
%left '+' '-'
%left '*' '/' '%'
%left MINUS
%%
lst:
        | lst '\n'
        | lst exp '\n'  { printf("%d\n",$2); }
       ;
exp: NUMB { $$ = $1; }
        | '-' exp %prec MINUS { $$ = -$2; }
        | exp '+' exp { $$ = $1 + $3; }
        | exp '-' exp { $$ = $1 - $3; }
        | exp '*' exp { $$ = $1 * $3; }
        | exp '/' exp { $$ = $1 / $3; }
        | exp '%' exp { $$ = $1 % $3; }
        | '(' exp ')' { $$ = $2; }
       ;
%%

char *progname;
int lineno = 1;

void yyerror(char *s)
{
        fprintf(stderr,"%s: %s near line %d\n",
                        progname,s,lineno);
}

int yylex(void)
{
        int c;

        while ((c=getchar()) == ' ' || c == '\t');

        if (c == EOF)
                return 0;
        if (isdigit(c)) {
                ungetc(c,stdin);
                scanf("%d",&yylval);
                return NUMB;
        }
        if (c == '\n')
                lineno++;
        return c;
}

int main(int argc, char **argv)
{
        progname = argv[0];
        yyparse();

        return 0;
}


Считает вот такие выражения: -(46 + 74) / -2 +5 *(45+6*3)

kamre, давайте хоть Вы не будите про ассемблерные вставки. ;)
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Передача функции через строку

Сообщение kamre »

Serg79 писал(а):
02.04.2009 21:57
kamre, давайте хоть Вы не будите про ассемблерные вставки. ;)


А я не про вставки, я про кодогенерацию в рантайм :)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

2 kamre
Если надо считать быстро - строим дерево выражения и расчет (на С++) будет очень быстрым.
2 Serg79
а где в коде yyparse? или что-то не понял... да и начало - архистранное
Спасибо сказали:
kamre
Сообщения: 243
ОС: Win7/Ubuntu 11.10

Re: Передача функции через строку

Сообщение kamre »

NickLion писал(а):
02.04.2009 22:19
2 kamre
Если надо считать быстро - строим дерево выражения и расчет (на С++) будет очень быстрым.

Рассчет по дереву будет быстрым, но все равно на порядок или даже больше отстанет от нативного кода.

NickLion писал(а):
02.04.2009 22:19
2 Serg79
а где в коде yyparse? или что-то не понял... да и начало - архистранное

А это похоже bison используется у Serg79. Тоже вариант неплохой.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Передача функции через строку

Сообщение NickLion »

Опять сторонняя вещь. Можно и QtScript прикрутить. Не скажу, что это плохо. Просто для *себя* бывает очень полезным и велосипеды поизобретать. Тем более тут не сверхсложная задача, смысла использования сторонных вещей не вижу. Да и не уверен, что код с использованием bison не будет медленнее. В случае с boost просто замыкания использовались, а тут отельный генератор парсеров...
Спасибо сказали:
Аватара пользователя
AsMasteR
Сообщения: 93
ОС: GNU/Linux Ubuntu 9.04

Re: Передача функции через строку

Сообщение AsMasteR »

Serg79 писал(а):
02.04.2009 21:33
AsMasteR, Ты такой бред здесь несешь. Особенно понравилось про ассемблерные вставки. :)
Подожди минут десять, я сейчас напишу Тебе простенький синтаксических анализаторов для простых выражений. ;)

О_о я же не виноват, если некоторые при слове ассемблер со стула падают..
Кто тебе сказал, что мне нужен калькулятор?? Особенно в качестве бажного гугл кода... А нужный алг. я уже почерпнул из вышеперечисленных алгов. Кста, почти уже прогу закодил..
Что касается ассемблера, я планировал заменить все действия функции соответствуыщими асм эквивалентами и ф-циями (попутно избавившись от скобок) непосредственно в строке, а после передать управление в ячейку памяти, где находится эта строка.. ну и jmp домой.. конешн.. ну и что тут бредового?
Вот прям в этот самый момент я ЖИВУ, и радуюсь ЖИЗНИ и МИРУ на нашей маленькой планете. И ничто и никто не сможет переубедить меня в том, что я счастлив... Dont worry, be happy!!!! Жду друзей у себя на сайте WhiteHakeR
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Передача функции через строку

Сообщение RasenHerz »

AsMasteR писал(а):
02.04.2009 22:51
О_о я же не виноват, если некоторые при слове ассемблер со стула падают..
Кто тебе сказал, что мне нужен калькулятор?? Особенно в качестве бажного гугл кода... А нужный алг. я уже почерпнул из вышеперечисленных алгов. Кста, почти уже прогу закодил..
Что касается ассемблера, я планировал заменить все действия функции соответствуыщими асм эквивалентами и ф-циями (попутно избавившись от скобок) непосредственно в строке, а после передать управление в ячейку памяти, где находится эта строка.. ну и jmp домой.. конешн.. ну и что тут бредового?

никто от слова ассемблер со стула не падает.
если я правильно понял, вы хотите сделать что-то вроде преобразования "2 + 15*4" в следующую форму(для моего удобства будем называть этот код шеллом):

Код: Выделить всё

    movl    $2, %ecx
    movl    $15, %edx
    movl    $4, %eax
    imulq    %rdx, %rax
    movl    %eax, %edx
    movl    %ecx, %eax
    leal    (%rdx,%rax), %eax

или в следующий машинный код: unsigned char shell[] = {0xb9, 0x02, 0x00, 0x00, 0x00, 0xba, 0x0f, 0x00, 0x00, 0x00, 0xb8, 0x04, 0x00, 0x00, 0x00, 0x48, 0x0f, 0xaf, 0xc2, 0x89, 0xc2, 0x89, 0xc8, 0x8d, 0x04, 0x02 };
вопрос лишь в том, зачем все ЭТО? мало того, что вам придется анализировать строку на количество в ней чисел, потом расчитывать количество необходимого объма памяти для всех неопходимых ассемблерных команд, предварительно позаботившись о способе возвращения из шелла итогового значения, подготовке стека и регистров вызывающей функции к передаче управления (регистры нужно будет сохранить); следом нужно будет расположить все это в правильном порядке в памяти(читайте "в массиве"), передать управление в код (что проще простого) и молиться о том чтобы все это монструозное, корявое и непереносимое на другие архитектуры поделие работало. Весь выигрыш в скорости, который вам давал асм испарится вместе со всеми предварительными приготовлениями. И я еще не коснулся арифметики с плавающей точкой =)
на мой взгляд, проще уж организовать пайп с каким-нибудь интерпретатором (можно взять Python) и передать эту строку ему, получить и обработать результат. Как вариант можно использовать Qt+QScript - тоже очень удобная штука.
но если вам неймется, вы не боитесь трудностей, вам не жалко собственные нервы - пишите все с использованием асма.
Спасибо сказали: