Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прога с параметрами

Ответить
Настройки темы
Прога с параметрами

Пингвин по Киевски


Сообщения: 238
Благодарности: 0

Профиль | Отправить PM | Цитировать


#include <stdio.h>
#include <dlfcn.h>
#include <iostream.h>
int main(int args, char* argv[])
{
void *ext_library;
double value=0;
double (*powerfunc)(double x);
ext_library = dlopen("/root/Pro/libpowers.so",RTLD_LAZY);
if (!ext_library)
{
fprintf(stderr, "dlopen() error: %s/n", dlerror());
return 1;
};
powerfunc = dlsym(ext_library, argv[1]);
value = 3.0;
cout << argv[1] << value << (*powerfunc)(value);
dlclose(ext_library);
}

Вот такая прога при компиляции выбрасывает вот это :
[root@localhost Pro]# gcc main.cpp -o main -ldl -lstdc++
main.cpp: In function `int main (int, char **)':
main.cpp:15: cannot convert `void *' to `double (*) (double)' in
assignment

Пожалуйста помогите !!!

Отправлено: 19:11, 16-04-2003

 

Старожил


Сообщения: 163
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата:
double (*powerfunc)(double x);
Цитата:
void *ext_library;
пытаетесь  void *ext_library вставить вместо double x

и еще
Цитата:
powerfunc = dlsym(ext_library, argv[1]);
argv[1] у нас char *, а не double

-------
"Сколь бы сложной ни казалась проблема на первый взгляд, она, если правильно к ней подойти, окажется еще более сложной" - Пол Андерсон


Отправлено: 20:31, 16-04-2003 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Пингвин по Киевски


Сообщения: 238
Благодарности: 0

Профиль | Отправить PM | Цитировать


А как переписать программу ?

Отправлено: 15:44, 06-05-2003 | #3


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


Nigon
Цитата:
powerfunc = dlsym(ext_library, argv[1]);
Здесь всё ок! В смысле передачи параметров. Только dlsym возвращает void *. Необходимо сделать преобразование типов перед присваиванием.

powerfunc = (double (*) (double)) dlsym(ext_library, argv[1]);

Добавлено:

Я бы ещё на нуль проверил. Вдруг такой функции в разделяемой библиотеке нет... И еще надо быть уверенным, что, если функция есть, она принимает один параметр заданного типа и возвращает данные типа, который нужен.

Добавлено:

Допустим в /root/Pro/libpowers.so есть три функции:

double first(double x);
int second(double x);
double third(double x, double y);

Тогда myprog first - сработает.
myprog second и myprog third - рухнут, second вернёт не то, что мы ждем (да и механизм возврата значений типов int и double разный), а third сама ждёт, что ей два параметра передадут, а мы только один пытаемся подсунуть (проблемы со стеком).

Ну, а myprog fourth - вообще облом, ну нету там такой функции, а мы её вызываем...

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 02:55, 07-05-2003 | #4


Пингвин по Киевски


Сообщения: 238
Благодарности: 0

Профиль | Отправить PM | Цитировать


shurikan

Я вставил (double (*) (double)) --- НЕ ВЫШЛО

Теперь пишет следуюшие:
[root@localhost les8]# gcc main.cpp -o main -ldl
main.cpp: In function `int main (int, char **)':
main.cpp:9: cannot convert `double (*) (double)' to `void *' in
assignment
main.cpp:15: cannot convert `void *' to `double (*) (double)' in
assignment

И еще, вот содержание библиотеки libpowers.so:
double power2(double x)
{
return x*x;
};
double power3(double x)
{
return x*x*x;
};
double power4(double x)
{
return power2(x)*power2(x);
};





Отправлено: 19:29, 07-05-2003 | #5


Пингвин по Киевски


Сообщения: 238
Благодарности: 0

Профиль | Отправить PM | Цитировать


Ну что ? Неужели нихто не знает ?

Отправлено: 14:50, 18-05-2003 | #6


Аватара для shurikan

Старожил


Сообщения: 240
Благодарности: 1

Профиль | Отправить PM | Цитировать


Nigon
Извини, долго не было на месте, командировка, млин...


Цитата:
powerfunc = (double (*)(double))dlsym(ext_library, argv[1]);
Вот здесь нужно прямое преобразование типа.


Добавлено:

Цитата:
ext_library = dlopen("/root/Pro/libpowers.so",RTLD_LAZY);
Эту не трогай...

-------
UNIX, UNAS и др. Myself I'll like 'em


Отправлено: 16:00, 19-05-2003 | #7


Пингвин по Киевски


Сообщения: 238
Благодарности: 0

Профиль | Отправить PM | Цитировать


shurikan
УРААААААААААААААААААААА !!! ПОШЛО !!! *

БОЛЬШОЕ ТЕ СИШНОЕ И ЛИНУКСОИДНОЕ СПАСИБО
*

Отправлено: 18:22, 19-05-2003 | #8



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Прога с параметрами

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Вызов Run() с параметрами evg64 AutoIt 10 15-05-2010 19:52
HotKeySet и вызов функции с параметрами r35p3ct AutoIt 4 24-09-2009 16:28
Разное - моя первая прога прога, написаная на делфи KingMaker Программирование и базы данных 9 12-01-2009 02:12
Проблема с параметрами видео slonikdva Непонятные проблемы с Железом 4 24-03-2008 14:24
Прога для чтения 3gp видеофайлов и прога для перекодирования mp3 в wav Myasnikov Мобильные ОС, смартфоны и планшеты 8 12-10-2005 15:34




 
Переход