Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.80/35: Рейтинг темы: голосов - 35, средняя оценка - 4.80
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891

Вызвать функцию по ее имени в текстовой переменной

31.05.2012, 23:06. Показов 7100. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, задача следующая:

C++
1
String function="myfunction()"
Теперь ниже мне каким-то образом надо вызывать функцию myfunction(), оперируя переменной function - возможно?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.05.2012, 23:06
Ответы с готовыми решениями:

Вопрос об использовании текстовой переменной в качестве имени объекта.
Привет! Пытюсь реализовать использовании переменной в качестве имени объекта - неполучается - поиск не рулит ))) помогите если не...

Как использовать радиобаттон - при выборе присвоить переменной значение или вызвать функцию.
у меня надо будет запускать программу, но кто будет ходить первым должен выбрать пользователь. Ходит или комп или игрок. Выбор решил будет...

Вызвать функцию по ее имени в TextBox
Есть dll с огромным количеством функций и под управлением TCP клиентской программы, с сервера будут приходить команды вызова этих функций и...

31
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
01.06.2012, 10:58
Студворк — интернет-сервис помощи студентам
мысли в слух: гораздо интереснее в подобных задачах момент запаковки/распаковки аргументов. все это очень похоже на RPC или маршалинг.
0
1569 / 505 / 48
Регистрация: 04.04.2009
Сообщений: 1,891
01.06.2012, 11:08  [ТС]
vxg, благо мне аргументы не требуются
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.06.2012, 11:19
Если использовать таблицу соответствия, то придется как минимум один раз забивать ее ручками. Потом можно, не напрягаясь, делать поиск в ней циклом.

Есть и альтернатива. Вынести функции в dll, экспортировать их, а потом просто получать их адреса с помощью API'шной GetProcAddress().
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
01.06.2012, 11:57
Цитата Сообщение от BRcr Посмотреть сообщение
потом просто получать их адреса
список имен откуда взять? из DEF файла)? какая-то половинчатая автоматизация. но очень заманчивая.
0
103 / 74 / 10
Регистрация: 29.05.2010
Сообщений: 192
01.06.2012, 13:45
хэш-функция может быть такой:
C++
1
2
3
4
5
6
7
8
9
int p = 31;
long long hash = 0, p_pow = 1;
for (int i=0; i<s.length(); ++i)
{
// желательно отнимать 'a' от кода буквы
// единицу прибавляем, чтобы у строки вида 'AAAAA' хэш был ненулевой
hash += (s[i] - 'a' + 1) * p_pow;
p_pow *= p;
}
p - простое число, примерно равное количеству символов во входном алфавите
степени p разумно закешировать для быстрого вычисления хэш-функции

Вероятность возникновения коллизий, конечно, очень мала, но для борьбы с коллизиями можно использовать двойное хэширование (разными хэш-функциями).

С другой стороны, если набор строк небольшой и особых требований к скорости нет, возможно имеет смысл не городить огород а использовать сравнение строк, это будет проще, а оптимизировать и потом можно будет если понадобится
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.06.2012, 15:44
мысли в слух: гораздо интереснее в подобных задачах момент запаковки/распаковки аргументов. все это очень похоже на RPC или маршалинг.
vxg, а где об этом лучше почитать?

http://ru.wikipedia.org/wiki/У... в_процедур
0
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
01.06.2012, 17:26
про RPC даже не знаю где, а про маршалинг полно написано, но это иепархия COM - он так между процессами и машинами аргументы тащит. вообще самый безгеморный способ удаленного вызова - это вызов метода интерфейса COM
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
01.06.2012, 17:32
C
1
2
3
4
std::map<std::string, void*>FuncArray; // ключ - имя ф-ции, значение - адрес
 
someFunc = FuncArray["myFunc1()"];
someFunc();
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
02.06.2012, 00:42
Цитата Сообщение от vxg Посмотреть сообщение
список имен откуда взять? из DEF файла)? какая-то половинчатая автоматизация. но очень заманчивая.
Нет, что самое приятное - можно запросто обойтись без подобного файла.

The_Immortal, в ответ на лс, имел ввиду я вот что: выносим нужные функции в dll, объявляем их со спецификатором __declspec(dllexport). Затем, когда надо вызвать одну из них, подключаем dll с помощью, например, LoadLibrary() и вызываем нужную функцию, получая ее адрес с помощью GetProcAddress().

Примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
HMODULE dll;
typedef void ( *my_func_type ) ( void );
typedef void ( *my_func_with_params_type ) ( int, std::string );
 
if ( dll = LoadLibrary( "my_dll.dll" ) ) {
  my_func_type my_func;
  if ( my_func = ( my_func_type ) GetProcAddress( dll, "my_function" ) ) {
    my_func( );
  }
  my_func_with_params_type my_func_with_params;
  if ( my_func_with_params = ( my_func_with_params_type ) GetProcAddress( dll, "my_function_with_parameters" ) ) {
    my_func_with_params( 5, std::string( "hi there:)" ) );
  }
}
1
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
02.06.2012, 08:28
мой сарказм был вызван следующим - существует ли способ из имеющейся DLL вынуть имена функций, типы и имена аргументов и результатов. не руками.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
03.06.2012, 12:05
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от vxg Посмотреть сообщение
существует ли способ из имеющейся DLL вынуть имена функций, типы и имена аргументов и результатов. не руками.
Ну, в данном случае в этом нет необходимости. ТС сам пишет библиотеку, сам именует функции - разумеется он все про них знает и так, ничего вытаскивать ему не надо.

Однако, если интересно, то да - способ есть, иначе не пользовались бы мы недокументированными функциями WinAPI. Имена экспортированных функций узнать можно относительно легко.
Доступ к секции с таблицей экспортируемых функций осуществляется с помощью функции ImageDirectoryEntryToData, при вызове которой в значении третьего параметра (DirectoryEntry) указывается константа IMAGE_DIRECTORY_ENTRY_EXPORT. Данная функция возвращает указатель на таблицу экспортируемых функций, которая имеет следующую структуру:
СмещениеРазмерПолеОписание
04Export flagЗарезервировано. Должен быть 0
44Time/Date stampВремя и дата, когда были созданы экспортируемые данные
82Major VersionСтаршее число номера версии
102Minor VersionМладшее число номера версии
124Name RVAОтносительный адрес строки, содержащей имя данной DLL
164Ordinal BaseНачальный порядковый номер в таблице экспорта. Оычно равен 1
204Address Table EntriesЧисло записей в таблице экспортиремых адресов
244Number of Name PointersЧисло записей в таблице экспортируемых имён.
284Export Address Table RVAОтносительный адрес таблицы экспортируемых адресов
324Name Pointer RVAОтносительный адрес таблицы экспортируемых имён
364Ordinal Table RVAОтносительный адрес таблицы порядковых номеров (ordinal)
Источник.
Что же касается аргументов, то тут без бубнов уже не обойтись... разве что разработчик dll оставил нам в подарок отладочную информацию.
В случае если библиоека написана на C++ и экспортирует C++ имена, то IDA Pro может немного облегчить определение аргументов. Если же на C, то придется заняться дизассемблированием — посмотри откуда еще эта функция в библиотеке, как используются аргументы функции при вызове известных из документации API-функций и т.д. Дизассемблируй другие программы, которые итспользуют эту библиотеку. Количество байт, которые они занимают легко определить, если функция формирует кадр стека — посмотри сколько вычитается из esp — в начале функции. Если же библиотека идет с соответствующей отладочной информацией (C7 compatible например), то тебе светит увидеть даже имена аргументов и локальных функций, которые им дал разработчик — IDA Prop 4.18 понимает такую отладолчную информаци + IDA умеет сама назначать имена локальным переменным функции в случае если они используются в известных IDA-е API функциях.
Это не реклама IDA. Просто ВЕЩЬ с большой буквы.
/////////////////////////////////////////////////////////////////////////////
К сожалению, во многих случаях эта информация просто отсутствует в модуле. И тогда уже никакой инструмент не поможет. Ведь в оригинале было как: DLL экспортирует точку входа в функцию по её имени. А что это за функция, какие параметры, что возвращает — про это должен знать тот, кто вызывает.
Многие более "продвинутые" языки программирования вносят эту информацию в модуль в виде "decoration" или "mangling" имени функции. Т.е. существо дела не меняется. Модуль по-прежнему содержит информацию в том же формате: имя_функции -> адрес. Но теперь имя функции содержит её кодированную сигнатуру. Например, из int Foo(int, int) C++ сделает ?Foo@@YGHHH@Z
Microsoft Dependancy Walker Version 2.1 показывает "раскодированную" сигнатуру. Т.е. вышеприведённую ?Foo@@YGHHH@Z он покажет как "C++ int Foo(int, int)"
/////////////////////////////////////////////////////////////////////////////
Все было бы хорошо, если бы прототипы функций были такими простыми. А что если в функцию передается аргументом указатель на черти-какую структуру (в лучшем случае просто структуру, в худшем нормальный класс). Да мы увидим имя типа структуры — уже кое-что, но дальше придется восстанавливать ручками структуру (по крайней мере нужные поля) или смотреть как она заполняется перед вызовами функций из библиотеки. Если структура большая и используется по разному во многих функциях, то задача становится весьма сложной — знаю на своей шкуре.
3
Модератор
 Аватар для vxg
3410 / 2182 / 354
Регистрация: 13.01.2012
Сообщений: 8,468
04.06.2012, 06:58
Цитата Сообщение от BRcr Посмотреть сообщение
разумеется он все про них знает
конечно знает, однако когда речь идет о нескольких или нескольких десятках или нескольких сотнях функций разбросанных везде выискивание их имен становиться утомительным
Цитата Сообщение от BRcr Посмотреть сообщение
Имена экспортированных функций узнать можно относительно легко
о! это хорошо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.06.2012, 06:58

Как вызвать значение переменной в другую функцию
Как вызвать значение переменной типа string в другую функцию не используя ref, out

Изменить переменную и вызвать функцию с новым значением переменной
Здравствуйте. Есть такой код: jQuery(document).ready(function slider(){ var sc=$(&quot;.slider img&quot;).size(); var count=2; ...

Как вызвать функцию в Qt с переменной, которая берется из другой формы?
Есть две формы (firstForm и MainWindow). В firstForm присутствует SpinBOX, из которого мне нужно брать значение, что задает пользователь....

Возможно ли вызвать функцию, имя которой хранится в переменной типа char* ?
Или возможно ли создать указатель на функцию по имени в переменной. Извиняюсь за неконкретный вопрос, просто ещё не полностью продумал...

Как вызвать функцию, имя которой указано в переменной типа String?
гугл не помог(


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
сукцессия 5
anaschu 26.06.2026
ПЛАН РАЗРАБОТКИ математической модели сукцессии микоризных систем Переход AM → EcM (Endo + ErM) · Шумилов А. С. · ИФХиБПП РАН · Пущино · 2026 . . .
сукцессия 4
anaschu 25.06.2026
Более детализированный план разработки План доработки модели динамики микоризных симбиозов (EcM с гистерезисом) Цель: Реализовать логику переключения между эрикоидным (ErM) и эктомикоризным. . .
сукцессия 3
anaschu 25.06.2026
Примерный план работ по модели
сукцессия 2
anaschu 25.06.2026
параметризировочная калибровочная таблица будущей модели
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru