Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Прога с параметрами (http://forum.oszone.net/showthread.php?t=30494)

Nigon 16-04-2003 19:11 208864

#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

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

Crew 16-04-2003 20:31 208865

Цитата:

double (*powerfunc)(double x);
Цитата:

void *ext_library;
пытаетесь  void *ext_library вставить вместо double x

и еще
Цитата:

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

Nigon 06-05-2003 15:44 208866

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

shurikan 07-05-2003 02:55 208867

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 - вообще облом, ну нету там такой функции, а мы её вызываем...

Nigon 07-05-2003 19:29 208868

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);
};





Nigon 18-05-2003 14:50 208869

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

shurikan 19-05-2003 16:00 208870

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


Цитата:

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


Добавлено:

Цитата:

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

Nigon 19-05-2003 18:22 208871

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

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


Время: 07:15.

Время: 07:15.
© OSzone.net 2001-