Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2010, 18:35   #1
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию Вызов функции по её адресу

Есть такой код:

Код:
#include <stdio.h>
#include <dlfcn.h>

int main()
{
    void simplefunc();
    void * addr = dlsym( NULL, "simplefunc" );
    return 0;
}
void simplefunc()
{
    printf( "Yahhhooooo!!!\n" );
}
Необходимо вызвать функцию simplefunc, зная лишь её адрес. Ассемблер знаю посредственно. Если можно обойтись без него одним лишь cdecl, буду рад) Пишется всё под gcc.
P.S И возможно ли без использования асм так же вызвать фнкцию с аргументами?

Последний раз редактировалось nowaalex; 22.08.2010 в 18:38.
nowaalex вне форума Ответить с цитированием
Старый 22.08.2010, 18:49   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
#include <stdio.h>

void f()
{
printf("Hi, Multiverse!\n");
}

int main()
{
void (*g)();
g = &f();   //или g = f();   - у функций свободные отношения с указателями
*g();   //или g();   - аналогично
return 0;
}
Оно?
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 22.08.2010, 18:52   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

1. объявить прототип функции
2. создать переменную указатель на данный тип
3. присвоить через приведение типов адрес функции к данной переменной
4. вызвать как обычно функцию (переменную)
BOBAH13 вне форума Ответить с цитированием
Старый 22.08.2010, 19:05   #4
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

Компилятор пишет "void value not ignored as it ought to be"

Не совсем оно. Попробую объяснить поподробнее. Есть два файла. В одном из них, назовём его 1.so, определена одна лишь единственная C++ функция( к примеру, тот же simplefunc ). В другом, 2.cpp, пока что есть что-то подобное:
Код:
#include <stdio.h>

int main()
{
      /*тут идёт подключение динамической библиотеки с помощью dlopen*/
      printf( "Hello! This is a main file!\n" );
/*
А тут идет вызов функции simplefunc
*/
      return 0;
}
Только создание динамической библиотеки будет происходить тоже динамически( с помощью bash-скрипта ), а С++ файл перекомпилировать я не хочу. Имя функции simplefunc может быть и другим. Нужно достать из библиотеки имя и вызвать её.

Другими словами, мы имеем вот что:
Код:
char * funcname = "simplefunc";
И всё.
Зная лишь имя, мне нужно вызвать функцию.
nowaalex вне форума Ответить с цитированием
Старый 22.08.2010, 19:06   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2nowaalex
dlopen + dlsym. пример есть в мане
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 22.08.2010, 19:18   #6
nowaalex
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 59
По умолчанию

А если как тут
http://habrahabr.ru/blogs/cpp/78886/
Только без заполнения стека( аргументов у функции не будет )
На асм сделать вызов
Только как это сделать?

Последний раз редактировалось nowaalex; 22.08.2010 в 19:21.
nowaalex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вызов функции по указанному адресу michurinec Общие вопросы C/C++ 3 24.03.2010 19:25
Вызов функции класса по адресу VintProg Общие вопросы Delphi 9 03.11.2009 05:17
Вызов процедуры/функции W0LF Общие вопросы Delphi 7 26.07.2009 23:53
Вызов функции по событию phobos Общие вопросы .NET 8 26.05.2009 01:06
Вызов функции MarSeON PHP 2 01.08.2008 20:22