|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||||||||||||||||||||
Альтернативный вызов функции15.08.2014, 10:44. Показов 6827. Ответов 66
Метки нет (Все метки)
1. Интересует метод вызова функции через указатель(или по другому).
2. Интересует метод взятия кол-ва аргументов функции и их типов, а так же тип возвращяемого значения. По второму пункту вообще ничего не нашёл, а по первому есть некоторые вопросы.
Ещё заинтересовало такое:
П.С. Если это возможно, приводите пожалуйста примеры без использования STL и классов, а более приближенными к Си методами. Вообще по поводу пункта 2: подумалось, что если реализовать пример1, то нужен будет список функций, который я в принципе могу хранить в txt фале вместе с кол-вом аргументов и возвращяемым значением, хотя это будет тупое копирование строк из .h файлов, к примеру из winuser будут подобия:
Добавлено через 29 минут Узнал что это:
0
|
|||||||||||||||||||||||||||||||
| 15.08.2014, 10:44 | |
|
Ответы с готовыми решениями:
66
Вызов функции внутри другой функции с передачей локальной переменной по ссылке
Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель) |
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||
| 19.08.2014, 08:17 [ТС] | ||||||||
|
Что то пример который дал StailGot не компилится... на VStudio(2005)
1. Ошибка:
Добавлено через 13 минут Кстати нашёл на MSDN эту тему... http://msdn.microsoft.com/ru-r... 39779.aspx но почему же компиляционные ошибки то( Добавлено через 9 минут При этом MSDN пишет:
0
|
||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||
| 19.08.2014, 09:10 | ||
|
Кстати на С стандарт тоже обновился и тоже в 2011 году.
0
|
||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||||||||||||||||||
| 19.08.2014, 10:33 [ТС] | ||||||||||||||||||||||
|
Да заработало (установил VS 2013). Только теперь всё же остался вопрос с возвращяемым значением, оно не во всех функциях будет int. Как я понял из void* в int только warning, а вот уже даже с float будет error.
Прототип через шаблон функции, который предложил StailGot можно как то привести к динамическому использованию возвращяемого результата? (чтоб и double, и многие другие работали?) Добавлено через 20 минут П.С. Поясню сразу, что таблица с значениями у меня будет, т.е. я буду заранее знать какой тип вводить и выводить. Например:
Да и ещё меня инетересует, можно ли исходя из типа вызова с помощью каких нибудь директив указывать использование _stdcall, например хотел было сделать так:
Добавлено через 5 минут Подумалось, по пункту возвращяемого значения... Ведь я могу изменить функцию:
0
|
||||||||||||||||||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 19.08.2014, 15:17 | ||
|
Izual,
0
|
||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||
| 19.08.2014, 15:27 [ТС] | |||||||
|
Может есть какой то способ динамического приведения типа или что то вроде этого, просто хочется один раз написать прототип и не париться. Я хочу так:
0
|
|||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||
| 19.08.2014, 16:05 | |||||||
|
Izual, Понял я все. Нет, нельзя так сделать. И через enum не получится, т.к. сигнатура функции ДОЛЖНА быть известна на этапе компиляции. Фича с variadic templates на самом деле тоже работает на этапе компиляции, т.е. когда мы пишем call(fun, args...) мы знаем, что передается некий указатель на void и абсолютно конкретные аргументы, уже на этапе компиляции.
Добавлено через 13 минут
0
|
|||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
| 19.08.2014, 16:49 [ТС] | |
|
Не знаю в тему ли, но накапал: http://www.drdobbs.com/cpp/ext... 586?pgno=2
Используется Variant... может и в возвращяемое значение его получится сунуть в моём случае?
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
| 19.08.2014, 17:39 | |||||||||||
|
Izual, Вряд ли. Единственное, что я могу предложить это работать очень аккуратно через ваш ENUM.
Что-то вроде
0
|
|||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||
| 19.08.2014, 22:19 | ||||||
|
Izual, Для настоящей динамики у нас должно быть динамическое окружение. С шаблонами мы так или иначе остаемся в рамках строгой типизации. Т.е. по настоящему динамичен будет только тот самый первый вариант, с VM (Virtual Machine) внутри нашей программы (которую реализует эта библиотека).
Есть высказывание, что "любую задачу можно решить увеличением уровня абстракции, кроме задачи слишком большого числа уровней абстракций". В данном случае именно это и есть единственное решение. Мы вынуждены организовать динамическую систему (новый уровень абстракции, по сравнению с самим языком С++) внутри нашей программы, чтобы она во время работы приложения, обеспечивала нужную нам функциональность - в частности реализовать загрузку допустимых прототипов из файла. С другой стороны, так ли нужна тебе эта динамика? Может просто ограничиться возможность задания прототипа "по месту", что, собственно, у нас почти получилось? А возвращаемое значение можно и так обыграть:
1
|
||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||
| 20.08.2014, 07:42 [ТС] | |||||||||||||
|
Кстати тут ещё одна проблема нарисовалась, я как то её "на потом" откладывал, но в итоге она всё же немного помешает. Суть такова, если я хочу динамически передавать аргументы, то явно писать:
Добавлено через 8 минут Кстати а может вместо <int> я могу использовать type_name? (наткнулся тут на это http://www.cplusplus.com/refer... info/name/)
0
|
|||||||||||||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
||||||||||||||||
| 20.08.2014, 08:33 | ||||||||||||||||
|
А классы - это те же С-структуры, только с возможностью определеять операции для них. Вот например класс
С текущим решением дальше этого Добавлено через 9 минут
0
|
||||||||||||||||
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 20.08.2014, 09:41 [ТС] | |||
|
Что то последние посты меня не вдохновляют, пойду пить йад.
0
|
|||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 20.08.2014, 09:58 | |
|
Izual, Не вдохновляют потому что вы пытаетесь решить проблему на языке не предназначенном для решения этой проблемы. Гвозди тоже можно топором забивать, но зачем, если есть молоток?
0
|
|
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||
| 20.08.2014, 10:48 [ТС] | ||
|
ForEveR, слушайте, мне по поводу первого вопроса тоже говорили тоже самое. Но пришёл StailGot и показал как решить проблему. Не полностью, но это видимо потому что за 3 страницы опять наспамили (ну как обычно пока истину найдёш, куча подводных вопросов и ответов вышло).
Так что я думаю что и из оставшейся задачи тоже есть решение. Я не просто "думаю", я верю, потому что если бы С++ не мог бы решить подобные проблемы, то наверно уже давно бы другие языки были более популярны, а Си бы умер.
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 20.08.2014, 10:58 | |
|
Izual, С++ используется для решения своих задач. С++ статически-типизированный язык. Проблема использованием variadic-templates не решилась, мы все равно остались в границах этапа компиляции, а не этапа выполнения.
Послушайте DrOffset или Dmitriy_M, либо действительно полностью динамическое окружение (как в интерпретируемых, а не комилируемых языках или же как в языках с виртуальной машиной), либо кодогенерация.
0
|
|
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||
| 20.08.2014, 12:07 [ТС] | |||
|
Добавлено через 14 минут
0
|
|||
|
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
|
|||||||
| 20.08.2014, 13:58 | |||||||
|
В языке С++ и С нет такого механизма, который мог бы по известному в динамике списку аргументов положить параметры на стек и вызвать некую процедуру по адресу, а потом по известному в динамике типу возвращаемого значения адекватным образом получить возврат. Просто нет. Этот механизм надо делать. Можно использовать уже готовые решения, навроде того, что я уже предлагал. В принципе - это полностью решает все вопросы, но ты от чего-то это решением не считаешь. Ладно, хорошо. Тогда это можно сделать вручную с использованием встроенного ассемблера или написать отдельный модуль на ассемблере. Естественно работать будет для конкретного компилятора и конкретной платформы, т.к. встроенный ассеблер и вообще ассемблерные инструкции различаются на разных компиляторах и архитектурах соответственно. Если оставаться только в рамках языка, то любые динамические решения должны быть согласованы во всей системе. Очевидно, что WinAPI ничего не знает ни про any, ни про type_info, т.к. написано на С. И сами функции WinAPI не рассчитанны на динамическую типизацию из коробки, поэтому подчиняются все тем же законам статической типизации и предполагают, что компилятор сгенерирует код по заданному прототипу. Вот если бы функции сразу возвращали плиморфные типы или типы, или что-то вроде твоих union, то тогда можно было бы говорить о каким-то мыслимом обобщении в динамике без участия неязыковых средств. Теперь я бы хотел вернуться к исходной задаче. Ведь проблема, которую ты пытался этим решить, на самом деле не стоит такого решения. Если бы она стоила такого решения, то это решение давно было бы у всех на виду и все бы им пользовались. Но никто им не пользуется. Но раз уж тебе хочется просто не писать вручную приведение к нужным прототипам, и ты уже согласился на использование С++11, то можно ведь и так поступить и остаться при этом в рамках типизации С++, и не писать ужасных велосипедов на тему динамического вызова:
auto - это вывод типа переменной в С++11 исходя из возвращаемого выражением значения, в данном случае F в шаблоне функции (в F реальный прототип).
2
|
|||||||
| 20.08.2014, 14:29 | |
|
Не по теме: еще! еще бисеру насыпьте:popcorn:
0
|
|
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||||
| 20.08.2014, 14:33 [ТС] | |||||||||||||||
|
Как раз таки то что явно я могу не приводить кол-во аргументов для вызова - уже решает 1/3 задачи. (осталось 1-решить проблему с возвращяемым значением и 2-как нибудь массив передать, чтоб явно не писать кол-во аргументов в me или call) Теперь код:
Ещё раз повторю, задача строится на том чтобы описать вызовы тысяч функций через одну процедуру (я понимаю что я не правильно выражаюсь, но абстрактно смысл должен быть понятен). Добавлено через 2 минуты DrOffset, ну серьёзно, ты же видиш что я хочу, зачем лишнее пишеш? Быт заел? ![]()
0
|
|||||||||||||||
| 20.08.2014, 14:33 | |
|
Вызов функции визуал бейсика из функции явы скрипта Вызов функции из другой функции после нажатия на кнопку
Автоматический вызов функции при вызове функции Не работает без указателя вызов функции в функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Сезонность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы
Всем привет! Хочу поделиться свежим (и довольно. . .
|
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
|
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения:
- добавлена многоязычность
- добавлено снятие скриншотов
- добавлено поддержание бафов хождения по воде (для жреца, дк и шамана)
- и так, по. . .
|