Войти

Показать полную графическую версию : Прога с параметрами


Nigon
16-04-2003, 19:11
#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
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
А как переписать программу ?

shurikan
07-05-2003, 02:55
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
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
Ну что ? Неужели нихто не знает ?

shurikan
19-05-2003, 16:00
Nigon
Извини, долго не было на месте, командировка, млин...


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


Добавлено:

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

Nigon
19-05-2003, 18:22
shurikan
УРААААААААААААААААААААА !!! ПОШЛО !!! *:up:

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




© OSzone.net 2001-2012