Показать полную графическую версию : Прога с параметрами
#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
Пожалуйста помогите !!!
double (*powerfunc)(double x);
void *ext_library;
пытаетесь void *ext_library вставить вместо double x
и еще
powerfunc = dlsym(ext_library, argv[1]);
argv[1] у нас char *, а не double
А как переписать программу ?
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 - вообще облом, ну нету там такой функции, а мы её вызываем...
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);
};
Ну что ? Неужели нихто не знает ?
shurikan
19-05-2003, 16:00
Nigon
Извини, долго не было на месте, командировка, млин...
powerfunc = (double (*)(double))dlsym(ext_library, argv[1]);
Вот здесь нужно прямое преобразование типа.
Добавлено:
ext_library = dlopen("/root/Pro/libpowers.so",RTLD_LAZY);
Эту не трогай...
shurikan
УРААААААААААААААААААААА !!! ПОШЛО !!! *:up:
:) :biglaugh: :) :biglaugh: БОЛЬШОЕ ТЕ СИШНОЕ И ЛИНУКСОИДНОЕ СПАСИБО :biglaugh: :) :biglaugh: :)
:oszone: :oszone: :oszone: :oszone: :oszone: :oszone: :oszone: *
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.