143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||||||||||||||||||||||
1 | |||||||||||||||||||||||||||||||
Альтернативный вызов функции15.08.2014, 10:44. Показов 5186. Ответов 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
|
||||||
15.08.2014, 21:24 [ТС] | 21 | |||||
Видимо имелось в виду что мне придётся делать хедер с указанием на каждую функцию своего прототипа. Но это не вариант, слишком много получится, да и наверно к 1000 функциям одни эти прототипы займут тучу памяти или времени для поиска...
В смысле double и float можно эквивалентно равными считать? (ну я думаю что разница в 7-ом знаке после запятой не сильно скажется на точности, ну я не стремлюсь к такой скурпулёзности, важен сам принцип скорее) Контроль наверно будет исходя из сравнения аргументов функции и передаваемых типов, тут уж сам накалякаю. =) По поводу питона - это уже бредово, заново изучать целый язык, опять куча синтаксических отличий... не, я хочу с компоновкой данных разобраться и перейти к графике и звуку, заново начинать не разумно. Ну не совсем, например я не понял что это за " const mytype* ", это что же я могу свой enum TYPE тоже впихнуть чтоль? Кстати, а можно в качестве возвращяемого значения поставить void, а потом переопределить согласно возвращяемому значению? Типа чтоб написать:
Связь в 1000 функциях, и к каждой писать прототип - "нет, спасибо, я пойду" =) Не через "кривую ногу", на столько кривую, что меня от такого кода стошнит. (это весьма вероятно, я уже представил себе хидер с 1000 прототипами) и ответ в том что я хочу к своей динамической матрице(ссылка в 5 посте) переменных привязать возможность использования функций, но писать стандартно каждую функцию я не хочу, хочу динамики, хотя бы мнимой (как мнимая 3д графика, которая один хрен выводится на плоский монитор) В общем, нужны указатели на функции. Добавлено через 10 минут Решение так же есть в STL и векторах, на сколько я понял(хотя я не понимаю их, ну не нравится синтаксис, гадко выглядит), но я их не беру априори, То что челы чё та там сделали - не решает сути того что я хочу не просто чтоб всё работало, а чтоб это выглядело понятно.(опять повторяюсь) Дело не во "вреде и пользе", а в том что "я на месте не стою, щяс пойду и попляшу" Это я к тому что хочу чтоб программа сама плясала, а я ей только название танца давал бы. Ловить ошибки - с чего это? Если я правильно типы буду указывать и проверять, функции с непонятными типами - пропускать (ну доработаю если надо будет).
0
|
15.08.2014, 21:27 | 22 |
Вам нужен подход ООП. То есть создать Object и что бы все типы принебригались к нему(то есть как в шарпе, всё наследовано от Obkect)
тогда уже можно использовать неограниченое кол-во параметров(вроде в плюсах есть такая хрень, "..." ) Возможно я не прав, потому что давно плюсы изучал.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
15.08.2014, 21:29 | 23 |
В этом 'если' вся суть. Звучит как 'давайте просто не будем делать ошибки, делов-то'. По поводу плясок, кстати получается обратная ситуация. Ты отказываешься от того, чтобы плясал компилятор ( проверяя типы ) и вместо этого хочешь плясать сам ( все указывая руками )
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
15.08.2014, 21:38 [ТС] | 24 |
Voivoid, ты мне предлагаеш для каждой функции писать прототип или что? Ты если не согласен с моим методом - скажи свой, а то звучит как то странно. Но думаю что и ты не согласишся под 1000 функций писать прототипы.(даже если это сделает парсер, то как ни крути сколько же памяти сожрёт этот метод?)
Так я пытаюсь реализовать принципы ООП, но без векторов, STL и классов. А так сказать старыми методами. (вот например ссыль в 5 посте показывает как можно без вектора добиться динамического массива с изменяемыми типами переменных, а ведь таким сейчас ~никто не пользуется, у всех шаблоны, *bored*)
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|
15.08.2014, 21:39 | 25 |
Неа. Это основано на том, что mytype * кастится к void*, поэтому и общий каст прототипа функции void(*)(mytype*,mytype*) относительно безопасно можно скастить к void(*)(void*,void*).
void* - это только указатели. Все что угодно так не вернешь. Тем более как ты узнаешь что там на самом деле лежит? Даже если память выделять динамически и возвращать на нее указатель, то ее же надо как-то освобождать, да и понять что же там на самом деле в общем случае будет невозможно без дополнительной информации.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
15.08.2014, 21:48 [ТС] | 26 | |||||
А это нужно? То есть, я то узнаю, я же прочту из файла тип возвращяемого значения и v[o].t установлю в INT, далее запишу значение после выполнения.
Так же как и в той теме(наверно, хотя с void* я ещё не работал, честно говоря синтасис "char *s" я вообще в первые попробовал, всегда явно указывал на переменную):
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|
15.08.2014, 21:57 | 27 |
А как ты с ним будешь работать, если не знаешь что это?
А если там не массив? То тогда уже надо вызвать delete без []. Уже это ты не отличишь без доп инфы. А если там вообще память не через new выделена была? Например через malloc, тогда уже надо free вызывать. А если runtime, с которым собиралась библиотека другой версии, то тогда нужно будет функцию освобождения из того же runtime использовать, а не из своего. А если там библиотека вообще на другом языке написана? А если там не указатель на самом деле возвращается? В общем - это тупиковый путь. Все эти "если" ты, имея только void*, не распознаешь. Добавлено через 4 минуты Izual, В общем я считаю, что тебе информации тут дали вагон и маленькую тележку. Разбирайся. По мне, так та библиотека - это лучший выход, если хочешь остаться в рамках С\С++. Но решать тебе. Короче, удачи.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|
15.08.2014, 22:00 | 28 |
Сообщение было отмечено volodin661 как решение
Решение
Я предлагаю в статически типизированном языке оставаться в рамках системы типов и не пытаться головой пробить стену. Я честно говоря так и не понял что ты хочешь получить ( может я невнимательно читаю конечно, хз ), поэтому что-то конкретно посоветовать не могу.
Да уж все новое - это хорошо забытое старое В 80-х все мучились с динамическими массивами и вариантными типами из-за бедности языковых средств. Чтобы уменьшить сложность разработки ( ну и как следствие сократить количество испытываемой программистами боли ) в 90-х придумали шаблоны. В 2014 году читать, про то, что это все не нужно и надо все делать руками это, ну-ну-ну, кхм, весьма странно. PS: Если что, я тут с хронологией весьма вольно обошелся, но идея должна быть ясна.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|||||||||||
16.08.2014, 15:44 [ТС] | 29 | ||||||||||
Так, выкладываю первые тесты.
Тест первый, просто статически описал загрузку функции MessageBoxA. (хотя мучался долго, пока не дописал "_stdcall" в прототипе функция вызывалась, но на возврате значения вылезала ошибка и прога рушилась) Прикрепил архив, где Test1.exe это он и есть. Тест 1 работает.
Результат выполнения: MessageBox появляется, но как только его закрываеш вылезает ошибка: Тест 2.exe так же в архиве. П.С. Извиняюсь сразу за кучу инклюдов, я обычно не помню какие нужны, так что пихаю все подряд)))
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|||||||||||||||||||||
16.08.2014, 17:45 | 30 | ||||||||||||||||||||
Провел небольшое исследование. VS игнорирует stdcall для прототипа такого вида (причем на моей VS 2012 это происходит только в отладочной сборке).
Вот код:
В общем, как я уже говорил, работающий во всех случаях вариант без асма (хотя бы без знания) сделать будет тяжело (или даже невозможно). Добавлено через 34 минуты Вот код, который гененирует VS в релизе (я вручную добавил дебажную проверку):
Я переписал код для VS таким же способом и вставил проверку:
Не знаю чего тут посоветовать: юзай mingw, если не хочешь связываться с ассемблером
1
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
17.08.2014, 08:43 [ТС] | 31 | |||||
DrOffset, я нашёл другой выход, хотя он не так красив как тот который я хотел бы использовать (с троеточием), но зато решает проблему.
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|
17.08.2014, 15:36 | 32 |
Не будет работать с целыми больше 32 разрядов на 32 битной архитектуре, не будет работать с числами с плавающей точкой.
В общем в каких-то случаях работать будет, но это точно не самое корректное решение. Имей это в виду. Добавлено через 2 минуты Почитал бы ты литературу, на самом деле. А то, что сейчас - это же чистое шаманство. Хоть бы узнал на что тебе можно рассчитывать, а на что нет.
0
|
28 / 23 / 12
Регистрация: 25.08.2013
Сообщений: 44
|
|||||||||||
17.08.2014, 16:47 | 33 | ||||||||||
Так и должно быть.
Альтернативный вариант:
Упрощенный вариант
3
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|
17.08.2014, 16:53 | 34 |
StailGot, качественный workaround.
Только вместо void *, для передачи указателя, лучше использовать FARPROC.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
17.08.2014, 19:59 [ТС] | 35 |
Я как нибудь обойдусь 32 разрядами, а по поводу плавающей точки - печаль(не уж то даже float не будет работать с его разрядностью в 4 байта?)
На самом деле уже третий день капаю гугл, но не зная что и где копать - много не выкопаеш. StailGot, то что вы показали это не вариант для меня, я сразу сказал что векторы и STL не предлогать.
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
||||||
17.08.2014, 20:20 | 36 | |||||
Это не вектор и не STL ) Это текущий стандарт С++11, используются только базовые возможности, которые часть языка.
Да я не про гугл, а про книжки, того же Рихтера или Руссиновича. И по ассемблеру что-нибудь. В интернете вообще вся толковая информация на английском, ища на русском много не накопаешь. Вот ссылку хотя бы изучи, которуя я уже давал, про calling convetions. А это уже вопрос твоего понимания что такое целое число и что такое число с плавающей точкой и как они передаются на стек и снимаются со стека.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
17.08.2014, 21:03 [ТС] | 37 |
template, разве?..
Блин, реально *bored*, мне эти нынешние стандарты по барабану, сколько раз сказать это чтоб уже поняли, что я смотрю не на стандарты, а на простоту понимания. Программирование и так то достаточно сложное, а то что сейчас выводится в стандарты только лишь опускает нас в бездну(сутками чтоли изучать всё появляющиеся стандарты?), а в конце результат - "у нас времени не было", как скажут многие на многие не сделанные вещи, время на которые сожрало изучение догматики.(а стандарты это и есть догматика) Ну так я переводчиком, тока один хрен слишком много непонятных моментов между строк, потому результат стремится к нулю) Нет, мы смотрим фактически на <= 32 бита(т.е. 4 байта). П.С. Как же много всякой ерунды напридумывали, лишь бы людей отвлечь от действительно важных вещей... Вспомнился фильм "Generation П" : "Народу нужна хорошая драка, тогда он про всё забудет, про жену, про квартиру..."
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|
17.08.2014, 22:41 | 38 |
Разве. Это часть языка. STL - это библиотека, и она не часть языка.
Английский учи Переводчик там тебе напереводит пожалуй. Учись, все равно как-то семью кормить потом придется
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
17.08.2014, 23:30 [ТС] | 39 |
векторы часть, да. Только условие было делать без них..
Не по теме: есть разные пути, не только "оседлые"
0
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,269
|
|
17.08.2014, 23:50 | 40 |
Опять ты невнимательно читаешь. Векторы - это не часть языка, это часть стандартной библиотеки, оно же STL, а ключевое слово template - часть.
Формально условие выполнено было
0
|
17.08.2014, 23:50 | |
17.08.2014, 23:50 | |
Помогаю со студенческими работами здесь
40
Вызов функции из другой функции после нажатия на кнопку Вызов массива, сформированной в одной функции с другой функции Автоматический вызов функции при вызове функции Не работает без указателя вызов функции в функции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |