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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подобие eval, Есть ли в C# ? 
V
    Опции темы
Валерия
Дата 23.10.2007, 22:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

string test="x = 5;";
int x;
x = 10;
eval(test); //такого не существует
Console.Write(x); //вот тут нужно что бы вывело 5


Так вот, eval точно нет, но есть ли какоето подобие eval в C# как у php или javascript?
PM MAIL   Вверх
archeg
Дата 24.10.2007, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 612
Регистрация: 6.1.2007
Где: Киев

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



Можно через System.Reflection.Emit, только оно не так красочно будет выглядеть smile
А зачем такое нужно?

П.С. Как вариант использовать CodeDOM - только код в таком случае есть оддельная сборка(поэтому доступ к даным немного сложнее. Вот пример:
Код

 CodeDomProvider provider = new CSharpCodeProvider();
            string[] strings = new string[]{ // Код который нужно динамически генерировать и запускать. Сопств. можно посчитать любое выражение :)
                @"using System; using System.Windows.Forms;
                class Program { public static void Main() {
                System.Windows.Forms.MessageBox.Show((2+2).ToString()); 
                }}"};
            CompilerParameters param = new CompilerParameters();
            param.MainClass = "Program";
            param.ReferencedAssemblies.Add("System.Windows.Forms.dll");
            CompilerResults result = provider.CompileAssemblyFromSource(param, strings);
            if (result.Errors.Count != 0)
            {
                foreach (CompilerError err in result.Errors)
                {
                    Console.WriteLine(err.ErrorText);
                }
                Console.ReadLine();
                return;
            }

            Type cl = result.CompiledAssembly.GetType("Program");
         
            MethodInfo mi = cl.GetMethod("Main");
            mi.Invoke(null, null);



--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
Валерия
Дата 25.10.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А можно пример с System.Reflection.Emit ?

З.Ы нужно что бы графики вводить не в исходнике а в форме.
PM MAIL   Вверх
marcusmae
Дата 27.10.2007, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Валерия, проблема в том, что C# (в отличие от php и jscript) не явялется интерпретируемым языком, соответственно, он не может динамически исполнять вновь прибывшие строчки кода.
Вариант, который предлагает archeg по сути состоит в том, что в дополнение к исполняющейся программе создаётся ещё один тип, а в нём - функция с кодом, получающимся, например, из Ваших текстовых строк. Эта функция компилируется в сборку, затем её можно вызывать из Вашей программы, например, через делегат.

В общем, технология весьма синтетическая. Я делал визуализатор на её основе (см. приложенный архив). Там так же двумерная функция, график которой надо построить, задавалась, как функция на языке C# прямо из формы.

Код очень похож на тот, что привёл archeg.

 

Это сообщение отредактировал(а) marcusmae - 27.10.2007, 18:21

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  VPF.part01.rar 78,13 Kb


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
marcusmae
Дата 27.10.2007, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


stravaganza
**


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

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



Например, функция

Код

using System;
public static class FunctionClass
{
    public static double Function(double x, double y)
    {
        //
        // TODO : Add plane function code here
        //
        return (x*x + y*y + 0.25)*(x*x + y*y + 0.25)-
            4*0.25*0.25*x*y;
    }
}


user posted image

Код

using System;
public static class FunctionClass
{
    public static double Function(double x, double y)
    {
        //
        // TODO : Add plane function code here
        //
        return -(x + y*y + 0.25)*(x*x + y + 0.25)-
            4*0.25*0.25*x*y;
    }
}


user posted image

Вторая часть архива :

Это сообщение отредактировал(а) marcusmae - 27.10.2007, 17:58

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  VPF.part02.rar 71,17 Kb


--------------------
ἀπὸ μηχανῆς θεός
PM MAIL ICQ GTalk   Вверх
Валерия
Дата 30.11.2007, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне нужно что бы я мог ввести в текстовое поле скажем
(2*Math.Sin(a))/5
и что бы когда клацнул на OK что бы график нарисовало
Собственно моя прога графики рисует, только эту строчку в самой проге нужно вводить smile
Есть ли еще какието способы, или готовые анализаторы строк, желательно попроще, что бы только +-*/ sin cos tg ctg
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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