Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вычисление произвольной функции 
:(
    Опции темы
q65
Дата 14.5.2011, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.5.2011

Репутация: нет
Всего: нет



Необходимо вычислять значения произволных функций ,которые подаются в виде строки. Можно ли это реализовать ,чтобы данная строка транслировалась в код -и создавался метод который был возвращал результат функции? 
PM MAIL   Вверх
Экскалупатор
Дата 14.5.2011, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



q65, думаю что если организовать динамическую компиляцию то можно что нибудь придумать...
PM MAIL ICQ   Вверх
-Mikle-
Дата 14.5.2011, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Обратная польская нотация (запись), если тебе не требуется именно компилировать ф-ии в код.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
q65
Дата 14.5.2011, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.5.2011

Репутация: нет
Всего: нет



хочется реализовать без парсинга строки
PM MAIL   Вверх
-Mikle-
Дата 14.5.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Как без парсинга? Какой синтаксис у формулы? Сишарповский?


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
q65
Дата 14.5.2011, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 14.5.2011

Репутация: нет
Всего: нет



забыл ,что в с# необходимо указывать класс для вызова мат функций- если можно не указывать, то топик еще атуален
PM MAIL   Вверх
Экскалупатор
Дата 14.5.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



Код

double Calc()
        {
            return 10 * 12 / 22;
        }

возвращает результат вычисленного выражения. если ты подставишь в исходный код другую строку(файл *.cs это текстовый файл), и скомпилируешь то метод будет возвращать то что ты в него запишешь. только кажется мне что проще написать парсер, чем реализовать динамическую компиляцию, в которой все равно придется искать то место в котором нужно поменять выражение.
PM MAIL ICQ   Вверх
-Mikle-
Дата 14.5.2011, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Невидимка Vingrad'а
***


Профиль
Группа: Экс. модератор
Сообщений: 1672
Регистрация: 22.6.2003
Где: Казахстан, Астана

Репутация: 4
Всего: 59



Если все таки компиляцию, то можно так:
Код

public static class Evaluator
{
    private const string codePart1 = "using System; public static class ";
    private const string codePart2 = "_Calc_";
    private const string codePart3 = " { public static double ";
    private const string codePart4 = "Eval";
    private const string codePart5 = "() { return ";
    private const string codePart6 = "; } }";

    public static double Evaluate(string expression)
    {
        CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        CompilerParameters param = new CompilerParameters { GenerateInMemory = true };
        CompilerResults result = codeProvider.CompileAssemblyFromSource(param, string.Concat(codePart1, codePart2, codePart3, codePart4, codePart5, expression, codePart6));

        if (result.Errors.HasErrors)
            throw new InvalidOperationException(string.Format("Произошла ошибка во время компиляции выражения:\r\n{0}", string.Join("\r\n", result.Errors.OfType<CompilerError>())));

        Type type = result.CompiledAssembly.GetType(codePart2);
        if (type == null)
            throw new InvalidOperationException("Непредвиденная ошибка (тип не найден).");

        return (double)type.InvokeMember(codePart4, BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod, null, null, null);
    }
}


используешь так:
Код

MessageBox.Show(Evaluator.Evaluate("(23+2)*2").ToString());
MessageBox.Show(Evaluator.Evaluate("Math.Sin(Math.PI) * Math.Cos(Math.PI)").ToString());


Но имей ввиду, что компиляция процесс не быстрый, так что пользуйся, только если производительность тебя устраивает. Но я бы на твоем месте сделал нотацию, тем более ,что делов там не много. Можно еще построить дерево выражений (Expression), но тоже вариант не производительный.


--------------------
Если тебе плюют в спину, значит ты впереди...
PM   Вверх
jonie
Дата 15.5.2011, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата(-Mikle- @  14.5.2011,  22:08 Найти цитируемый пост)
Но имей ввиду, что компиляция процесс не быстрый, так что пользуйся, только если производительность тебя устраивает. Но я бы на твоем месте сделал нотацию, тем более ,что делов там не много. Можно еще построить дерево выражений (Expression), но тоже вариант не производительный. 

мало того что не быстрый, так еще и требует full trust-а... 
Можно заюзать IronPython например, или другой какой язык.. в C#5 поговаривают Compiler as Service будет из коробки


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0497 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.