Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: выбор функции с параметрами из строки  (Прочитано 2948 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Serguntii
Помогающий

ru
Offline Offline

« : 09-11-2013 14:59 » 

Такая задачка : есть переменная String содержит она название функций с параметрами. Они постоянно меняются.
например на данный момент string str = foo("25,55,31")
Код:
//Парсинг строки str
{

     как сделать чтобы когда в str = foo("25,55,31")
     запустилась  foo("25,55,31")

}

//функция  foo("25,55,31")
public: void  foo(int a, int b , int c)
{


}

Хотелось бы покрасивее сделать, что бы без особых проблем менять название функций.
« Последнее редактирование: 09-11-2013 18:14 от sergeyan » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 09-11-2013 19:18 » 

Любиш ты себе искать приключения на филейную часть тела. Не знаю точно, может ли Регулярки в .NET нарезать отдельные куски текста. Но напрашивается для начала строку пропустить через регулярку (регулярные выражения). У тебя сразу будет производится проверка корректности строки. Нарезка названия функции и ее параметров. А потом только останется case технологию применить. Но это если у тебя функций не много. Для динамичной добаки уже будет чуть другой подход.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 09-11-2013 21:32 » 

А язык-то критически важен? А то

http://forum.shelek.ru/index.php/topic,29156.msg285399.html#msg285399
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #3 : 10-11-2013 04:04 » 

Функций много и они разные количество аргументов тоже у всех функций разное. Достаточно часто нужно вызывать, боюсь будет притормаживать если просто регуляркой перебрать. Какие еще способы есть?, еще бы хотелось что бы без особых заморочек можно было добавить функцию. Строка str из командной строки, эту строку нужно разобрать и вызвать функцию. Язык  C#

Добавлено через 28 минут и 8 секунд:
Спасибо за ссылку  кажется  то что надо. ) сейчас попробую. с Jvascrip не занимался в чем этот объект собирать? Пользуюсь vs c++ и vc c# express

Добавлено через 2 часа, 4 минуты и 10 секунд:
jsc.exe есть и можно запустить из командной строки, но я собираю в студии, там свойствах можно задать Post-build event command как эту строчку подогнать ?
%jsc% /out:jsi.dll /target:library /reference:csl.dll jsi.js
« Последнее редактирование: 10-11-2013 06:42 от sergeyan » Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #4 : 10-11-2013 06:58 » 

Хмм...,  а не проще ли напрямую создать ассоциативный массив соответствия строкового выражения и нужной функции?

Можно пойти еще следующим путем:
1. Все нужные функции объявляем экспортируемыми.
2. Создаем примерно такой код:
Код:
BOOL ExexProc(PWCHAR func)
{
      //код парсинга строки на имя функции и параметры, параметры записываем в массив
      PVOID p = NULL;

      p = GetProcAddress(GetModuleHandle(NULL),  funcname);
      if(NULL == p)
      return FALSE;

     for(int i = countparams - 1; i >= 0; i--)
     _asm push params[i]

     _asm
     {
             mov eax,p
             call eax
     }
    
     return TRUE;
}
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #5 : 10-11-2013 07:59 » 

Спасибо за вариант, но это наверно будет для c++ на C# не будет работать?
« Последнее редактирование: 10-11-2013 08:09 от sergeyan » Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #6 : 10-11-2013 08:28 » 

Про C# не знаю. Наверно с определенным извратом можно и в C#.
З.Ы. Забыл добавить к предыдущему посту - код только для 32-битных программ, для 64-битных программ вызов параметров будет несколько иной, плюс ассемблерный код надо будет запихивать в отдельный объектный модуль.
Записан
Serguntii
Помогающий

ru
Offline Offline

« Ответ #7 : 10-11-2013 09:12 » 

то что по ссылки все собрал появились dll теперь в vs2010  создал новый проект , добавил dll в references.
Добавил using libary, добавляю код JScriptInterpreter interpreter = new JScriptInterpreter();
вылетает ошибка
Error   1   The type 'Microsoft.JScript.INeedEngine' is defined in an assembly that is not referenced. You must add a reference to assembly 'Microsoft.JScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.   C:\Documents and Settings\Sergey\My Documents\Visual Studio 2010\Projects\test1\test1\Form1.cs   21   33   test1
 
Если правильно понимаю должен добавить сборку, но у меня ее нет.
'Microsoft.JScript, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.   C:\Documents and Settings\Sergey\My Documents\Visual Studio 2010\Projects\test1\test1\Form1.cs   21   33   test1


Добавлено через 2 часа, 39 минут и 24 секунды:
Моя была ошибка вроде скопировал код а Reference: не добавил. Еще вопрос можно в файле js обвить свои типы typedef  int mitip;? Код который по ссылке уже почти работает, может конечно еще где ошибся, но теперь вызов interpreter дает ошибку TypeError:Function expected
« Последнее редактирование: 10-11-2013 12:22 от sergeyan » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 10-11-2013 12:31 » 

Сам JavaScript - язык с нетипизированными переменными. Поэтому вопрос применительно к JavaScript попросту бессмысленный. В самом .NET typedef тоже не имеют смысла, поскольку это лишь синтаксический сахар. В C# возможно объявление aliases (псевдонимов) типов через конструкцию using. В C++ - через конструкцию typedef.

Ошибка function expected означает, что интерпретатор не видит функции.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #9 : 10-11-2013 12:49 » 

Понятно. Еще один вопрос по вашему коду, может что подскажите, вызов функций происходит с цифровыми аргументами, но иногда в строку попадает такая конструкция
Код:
foo1(10,20);
foo2(10,30);
некоторые функции идут в таком формате
foo3(DEF_PARAM_NUM);


DEF_PARAM_NUM он объявлен в файле
#define DEF_PARAM_NUM  44
Можно в js обявить эти параметры что бы когда функция в таком формате, происходил подмен  DEF_PARAM_NUM на цифру?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 10-11-2013 14:10 » 

sergeyan, конечно можно:
Код: (Javascript)
var DEF_PARAM_NUM = 44;

Но вопрос про "не видит функцию" интригует. Функции .NET, разумеется, находятся внутри того или иного класса, даже если они не методы объектов - static. Т.е. если идут функции
Код:
foo1(10,20);
foo3(44);
То реализованы они будут в некоем классе, допустим, Foo, и их вызовы будут:
Код: (Javascript)
Foo.foo1(10,20);
Foo.foo3(44);
Т.е. к каждой функции путём операции над строкой нужно будет добавить класс. Делать это может в общем-то и интерпретатор, если его усложнить. Дело в том, что в JavaScript поддерживается синтаксическая конструкция with, которая позволяет делать необходимое добавление с точкой для всего своего содержимого. Т.е. должно получиться:
Код: (Javascript)
with(Foo) {
foo1(10,20);
foo3(44);
}

Таким образом, единственным изменением будет небольшая правка в интерпретаторе:
Код: (Javascript)
                                eval(
                                        "with(Foo) { \n" +
                                                expression + "\n" +
                                        "}"
                                );
и тогда код:
Код:
foo1(10,20);
foo3(44);
будет работать.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #11 : 10-11-2013 14:22 » 

Все отличено работает, закрыл и заново открыл. ссылки удалил и заново добавил все заработало. Как раз то что нужно. спасибо ))
Я бы конечно не догадался до такого да и с js практически не знаком.


Добавлено через 6 дней, 15 часов, 51 минуту и 51 секунду:
Еще вопрос по этой теме,  вызов методов через интерпретатор Java работает хорошо, а можно как-то сделать обратный вызов из csl.cs ?
(дернуть метод csu.cs)

Добавлено через 2 дня, 4 часа, 54 минуты и 24 секунды:
Не могу придумать как это сделать, смысл такой что интерпретатор java дергает функции это работает.Функция которую вызываем через eval(  выполняет работу и через некоторое время должна ответить что можно еще раз ее вызывать, как вот это завязать?
« Последнее редактирование: 19-11-2013 12:16 от sergeyan » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 27-11-2013 22:07 » 

sergeyan, дык в чём проблема? Функция через return возвращает значение. Далее через объект кэша, обеспечив к нему доступ из csu - добавить дополнительные методы в интерпретатор.

P.S. И не надо называть JavaScript Java - это принципиально разные языки. А точнее это даже не JavaScript, а JScript.NET, потому что имеет специфический синтаксис (например, возможность делать типизированные переменные и описывать пользовательские типы данных).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Serguntii
Помогающий

ru
Offline Offline

« Ответ #13 : 27-11-2013 22:15 » 

Хорошо уже понял все работает Улыбаюсь
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines