Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
#1

Передача аргументов в функцию динамической библиотеки - C++

09.12.2014, 10:57. Просмотров 541. Ответов 19
Метки нет (Все метки)

И снова здравствуйте.

Я пытаюсь написать универсальный класс, который позволит мне обращаться к любым функциям динамических билиотек.
Проблема в том, что разные функции имеют разный набор аргументов разных типов. Соответственно не очень понятно какой тип переменной мне выбрать для передачи аргументов функции динамической библиотеки.

Самое умное что мне пришло в голову - использовать vector<void> и передавать указатели на переменные. Но этот вектор почемуто закопризничал и отказался выполнять resize и push_back.



Собственно текущий код класса

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#ifndef LIB_EXEC_H
#define LIB_EXEC_H
 
#include <stdio.h>
#include <iostream>
#include <vector>
 
using namespace std;
 
class lib_exec
{
public:
    lib_exec();
    void lib_func_exec();
    //vector<vector<std::string> >  result;
    void *result;
    vector <void> *argument;
    char *lib;
    char *method;
};
 
#endif // LIB_EXEC_H
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include "lib_exec.h"
 
lib_exec::lib_exec()
{
}
 
void lib_func_exec()
{
  void  *dl_handle      ;
  float (*func)(vector<void>)  ;
  char  *error          ;
 
  cout << "Открываем совместно используемую библиотеку" << endl;
  /* Открываем совместно используемую библиотеку */
  dl_handle = dlopen( lib, RTLD_LAZY )  ;
  if (!dl_handle)
  {
    printf( "!!! %s\n", dlerror() )     ;
    return                              ;
  }
 
  cout << "Находим адрес функции в библиотеке " << endl;
  /* Находим адрес функции в библиотеке */
  func  = dlsym( dl_handle, method );
  error = dlerror()                 ;
  if (error != NULL)
  {
    printf( "!!! %s\n", error )     ;
    return                          ;
  }
 
  cout << "Вызываем функцию по найденному адресу и печатаем результат" << endl;
  /* Вызываем функцию по найденному адресу и печатаем результат */
  result = *func(argument)  ;
 
  cout << "Закрываем объект" << endl;
  /* Закрываем объект */
  dlclose( dl_handle )      ;
 
}
Собственно вопросы:

1. Почему вектор отказывается изменять свой размер, ведь длина указателя по идее фиксированная и проблем быть не должно.
2. Какие ещё могут быть варианты "универсальной" переменной для передачи аргументов функции?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2014, 10:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Передача аргументов в функцию динамической библиотеки (C++):

Вызов функции одной динамической библиотеки из другой динамической библиотеки - C++
Добрый день! Помогите пожалуйста разобраться со следующим вопросом. Возможно ли из одной библиотеки передать параметры для...

Передача аргументов в функцию - C++
как передать аргумент в функцию по указателю? нашел только по значению: int sqr(int x); int main() { int t=10; ...

Передача аргументов в функцию - C++
Хочу размерность массива задать в отдельной функции, но не получается разобраться с передачей аргументов. Поясните, а то самому пока не...

Передача аргументов в функцию - C++
Доброго всем дня! Я немного не понял листинг программы из учебника Р.Лафоре: #include&quot;stdafx.h&quot; #include&lt;iostream&gt; ...

Передача аргументов в функцию - C++
Что сработает быстрее? void Func(const A &amp;a = A(0, 0, 0)) { } или void Func(A a = A(0, 0, 0))

Передача аргументов в функцию - C++
При сборке кода выдает ошибку (её я написал в комментарий). Что значит ошибка? #include &lt;iostream&gt; #include &lt;math.h&gt; using...

19
nmcf
6197 / 5508 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
09.12.2014, 12:43 #2
17-я строка сомнительна. Что за vector<void>?
Классы в библиотеку лучше не передавать, только простые типы и структуры.
0
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
09.12.2014, 13:17  [ТС] #3
Не в том идея.

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

Не хочется плодить одинаковые обращения к библиотеке.
0
nmcf
6197 / 5508 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
09.12.2014, 17:56 #4
Передавай указатель и какой-нибудь идентификатор.
0
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
09.12.2014, 18:08  [ТС] #5
Я так и хочу поступить.
Но перечень параметров разных функций в разных библиотеках может быть очень разным по длине.
Соответственно, если я хочу сделать "универсальный" вызов для любой функции, перечень указателей на параметры должен в идеале храниться в массиве. Я решил использовать для этой цели вектор. Но с типом данных void он почемуто отказывается работать корректно.
0
nmcf
6197 / 5508 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
09.12.2014, 21:29 #6
Почему нельзя реализовать несколько функций и уже при вызове решать какая подходит?
0
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
09.12.2014, 22:00  [ТС] #7
Можно... Просто не хочется)
Я надеюсь сделать одну универсальную функцию и больше эти вопросом не морочиться.
С С++ я недавно вожусь, а в PHP всегда так делал.
Если нет технической возможности, тогда разговор другой... Придётся делать несколько.
0
nmcf
6197 / 5508 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
09.12.2014, 23:21 #8
Ну есть функции с переменным числом параметров, там многоточие ставится. Не знаю, будут ли работать в dll, но даже если будут всё равно придётся как-то передавать тип и там его приводить.
1
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
09.12.2014, 23:35  [ТС] #9
Не... Ни разу ни так...

Во прервых я под линух пишу)
Во вторых библиотеки я свои для себя делаю. Так что с той стороны будут мои значения разбираться и преобразовываться как я захочу. Это всё не вопрос...
А что за функции с многоточиями? Есть какоето научное у них название?
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
09.12.2014, 23:49 #10
Цитата Сообщение от Kapitan79 Посмотреть сообщение
Есть какоето научное у них название?
Эллипсис.

PS. Не стоит в лоб тащить привычки из PHP в С++. Это языки с разными взглядами на типизацию.
1
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
10.12.2014, 00:00  [ТС] #11
Цитата Сообщение от DrOffset Посмотреть сообщение
Не стоит в лоб тащить привычки из PHP в С++
Сложно не согласиться. У меня просто пока не достаточно опыта чтобы сходу сказать что хорошо а что плохо.
Цитата Сообщение от DrOffset Посмотреть сообщение
Эллипсис
Спасибо! Интересная штука. Попробую применить...
0
DrOffset
7517 / 4513 / 1025
Регистрация: 30.01.2014
Сообщений: 7,362
10.12.2014, 18:01 #12
Цитата Сообщение от Kapitan79 Посмотреть сообщение
Попробую применить...
Не думаю, что оно того стоит.
0
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
10.12.2014, 18:32  [ТС] #13
Цитата Сообщение от DrOffset Посмотреть сообщение
Не думаю, что оно того стоит.
Я тут подумал и решил что лучше параметры функции буду в виде текстовой строки передавать. Просто в установленном формате. В библиотеке будет стандартная функция которая будет эту строку разбирать и запускать нужную функцию.
Я понимаю, что для опытного человека возможно это выглядит не целесообразным, но попытка не пытка.
Просто код очень сильно облегчается, если обращение к любой функции любой написанной мной динамической библиотеки будет осуществляться в одном коротком формате. Тем более если обращение это многократное.
0
nmcf
6197 / 5508 / 1929
Регистрация: 14.04.2014
Сообщений: 23,130
10.12.2014, 20:02 #14
Может тебе оставаться на PHP, если там задача лучше реализуется?
0
Kapitan79
3 / 3 / 0
Регистрация: 13.10.2013
Сообщений: 157
10.12.2014, 20:07  [ТС] #15
Не получится.
Да и не хочу.
В чём я не прав? Почему все с таким скепсисом относятся к такому стилю программирования?
Как будет оптимально писать, если я не прав?
0
10.12.2014, 20:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 20:07
Привет! Вот еще темы с ответами:

Передача динамической матрицы в функцию - C++
Здравствуйте подскажите пожалуйста, как можно передать динамическую матрицу, заданную и инициализированную следующим образом ...

Передача аргументов в функцию по ссылке и указателю - C++
Чем отличается передача по ссылке от передачи по указателю аргументов в функцию?

Передача аргументов в функцию и возврат значения - C++
Зачем нужны аргументы функции? Что делает return, если задать ненулевое значение? Как из main() перенести переменную в другую...

Передача в функцию и возврат из функции динамической матрицы - C++
#include &quot;stdafx.h&quot; #include &quot;iostream&quot; using namespace std; const int n = 8; double ** f (double ** mas, int n) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru