Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
#1

Статическая библиотека и ссылки на процедуры

21.06.2010, 13:10. Просмотров 1055. Ответов 9
Метки нет (Все метки)

Доброе время суток. Столкнулся с проблемой: необходимо из метода класса в статической библиотеке обратиться к процедуре, описанной вне библиотеки.
не могу понять как правильно инициализировать ссылку на процедуру в класса, как обращаться к ней из метода и как работать с ней в программе.
MyLib.h:
C++
1
2
3
4
5
6
7
8
9
10
namespace mine
{
    class generator
    {
        int m;  
        void (*Gen)(int &);
    public:
    void new_obj ();
    };
}
MyLib.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
#include "MyLib.h"
#include <stdexcept>
using namespace std;
namespace mine
{
    void generator::new_obj ()
    {
        m++;
        Gen (m);
    };
}
ну и, собственно, MyProg.cpp:
C++
1
2
3
4
5
6
7
8
9
10
void (*Gen) (int & N)
{
    cout <<N;
    return;
}
int main ()
{
    (*Gen) (N);
    return;
}
Добавлено через 1 час 5 минут
т.е.
1) так ли описывать ссылку в классе?
2) так ли обращаться к функции из метода класса?
3) так ли использовать её в программе?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2010, 13:10
Ответы с готовыми решениями:

Статическая библиотека
lib main.h namespace x { int __stdcall WindowCreate( ... ); } ...

Статическая библиотека
Добрый день. Подскажите, плз, описание статической библиотеки ее...

Ошибки,статическая библиотека
Не понимаю,что не нравится компилятору. Пишет,что для &quot;{&quot; требуется...

Статическая или динамическая библиотека
Хочу создать свои функции? Какие библиотеки лучше использовать?

Статическая библиотека MVS errorLNK1120
Нужно создать статическую библиотеку в MVS. появляется ошибка, для наглядности...

9
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 13:38 #2
1) так ли описывать ссылку в классе?
вы описываете не ссылку, а указатель на функцию, ну так правильно
Но где ее инициализация? дб нечто вроде

C++
1
2
3
4
5
6
7
8
class generator
{
        int m;  
        void (*Gen)(int &);
public:
    generator( void (*_Gen)(int &) ) : Gen(_Gen) {}
    void new_obj ();
};
Вообще правда мне кажется без особой надобности не стоит пользоваться таким связывание, по мне уж лучше
extern void libfunc( int & );
и уже ей пользоваться, либо просто хедер подключить библиотеки
1
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 13:58  [ТС] #3
благодарю за помощь
Цитата Сообщение от alex_x_x Посмотреть сообщение
generator( void (*_Gen)(int &) ) : Gen(_Gen) {}
метод, совпадающий с именем класса будет являться конструктором. разве описываемая процедура имеет к этому отношение? и ещё: компилятор (VC2010) указывает на ошибку на месте "generator( void (*_Gen)(int &) ) : Gen(_Gen) {}":
"инициализация: невозможно преобразовать "void (__cdecl *)(int &)" в "void (__cdecl *)(int &,int &)""
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 14:15 #4
метод, совпадающий с именем класса будет являться конструктором. разве описываемая процедура имеет к этому отношение?
я это к тому, что когданибудь инициализировать указатель надо будет, например в конструкторе
Цитата Сообщение от SentineL-88 Посмотреть сообщение
"void (__cdecl *)(int &)" в "void (__cdecl *)(int &,int &)""
Цитата Сообщение от SentineL-88 Посмотреть сообщение
void (*Gen)(int &);
у вас разные описания, видать Gen - (*Gen*)(int&,int&) - от двух параметров описан
1
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 14:40  [ТС] #5
да, точно =) мог бы и сам разобраться. ещё раз спасибо.
PS я так понимаю, в MyProg.cpp использовать имя "_Ger" (при такой инициализации) для описания процедуры?
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
21.06.2010, 14:47 #6
а я кажется понял что вы хотите, вы хотите из main передать функцию в lib, обычно бывает наоборот)

Цитата Сообщение от SentineL-88 Посмотреть сообщение
void fGen(int & N)
{
cout <<N;
return;
}
int main ()
{
generator gen;
gen.Gen = fGen;
gen.new_obj();
return;
}
_Gen переменная параметр конструктора всего для инициализации
1
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 03:04  [ТС] #7
вот-вот. именно это и хотелось. ещё раз спасибо

Добавлено через 11 часов 37 минут
почему-то после ввода этих указателей программа перестала правильно считать то, что она, собственно, должно считать (без них всё работает прекрасно) В чём может быть ошибка?
на всякий случай:
код

MyLib.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
class System                //класс системы в целом
{
    int t;                  //интервал моделирования
    long time;              //текущее время
    int m;                  //количество объектов
    void (*Sys)(int &, int &, double &, int &, int &, int &, int &);    //процедура, вызываемая при завершении интервала моделирования
public:
    System (int T, int M, void (*_Sys)(int &, int &, double &, int &, int &, int &, int &) );       //конструктор
    void newobj (generator *gobj);                              //добавление объекта в систему
    void delobj (int num, generator &g);                        //удаление объекта из системы
    void modelling (queue &, generator &, service_device &);    //моделирование
    int get_number ();                                          //возвращает количество объектов в системе
};
MyLib.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
System::System (int T, int M, void (*_Sys)(int &, int &, double &, int &, int &, int &, int &)) 
    {
        Sys=_Sys;
        t=T; 
        m=M; 
        time=m*60;
    }
    void System::newobj (generator *gobj) {gobj->new_obj ();}       //добавление объекта в систему
    void System::delobj (int num, generator &g) {}                  //удаление объекта из системы
    int System::get_number () {return m;}
void System::modelling (queue & q, generator & g, service_device & sd)
    {/*тут длинный код моделирования, по сути, не очень нужный сейчас, и в конце:*/
        int getN=sd.getN(); 
        int result=sd.result(); 
        double mid_time=sd.mid_time(); 
        int get_n=get_number(); 
        int get_minT=q.get_minT(); 
        int get_midT=q.get_midT(); 
        int get_maxT=q.get_maxT();
        Sys (getN, result, mid_time, get_n, get_maxT, get_midT, get_minT);
    }
MyProg.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void sys_proc (int &gN, int &res, double &mt, int &n, int &maxT, int &midT, int &minT)
{
    cout <<"Excavators: "<<gN<<"\nloaded: "<<res<<"\nmid loading time: "<<mt<<"\ntrucks: "<<n<<"\nmax waiting time: "<<maxT<<"\nmid waiting time: "<<midT<<"\nmin waiting time: "<<minT;
    return;
}
int main()
{
    srand (time(0));
    int m=8;                //количество машин
    int n=2;            //количество эксковаторов
    int t=8;            //интервал моделирования
    for (m=3; m<15; m++)
    {
        queue q(m);
        generator g (m, gen_proc);
        System s (t, m, sys_proc);
        service_device sd(n, ser_proc);
        s.modelling (q, g, sd);
        cout <<"\n\n";
    }
    getch();
    return 0;
}

программа перестаёт считать весь тот список переменных и вообще ведёт себя крайне странно: ставил "cout<<1;" везде где ни попадя (по-деревенски, но что поделать...), вообще представления не имею по какому принципу совершаются обходы циклов после введения указателей на процедуры.
0
JamesBlack
42 / 42 / 5
Регистрация: 28.07.2009
Сообщений: 144
22.06.2010, 03:39 #8
SentineL-88, расставь точки останова, или вообще пошагово иди. У тебя код небольшой, вполне реально.
1
ISergey
Maniac
Эксперт С++
1408 / 919 / 148
Регистрация: 02.01.2009
Сообщений: 2,749
Записей в блоге: 1
22.06.2010, 04:06 #9
Как на счет std::function в С++0х или boost::function
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
#include <functional>
 
void func1 () {  std::cout << "func_1\n"; }
void func2 () {  std::cout << "func_2\n"; }
void func3 () {  std::cout << "func_3\n"; }
 
int main()
{
    std::function<void ()> f;
 
    f = &func1;
    f();
 
    f = &func2;
    f();
 
    f = &func3;
    f();
 
    return 0;
}
Как на меня это проще...
2
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 10:52  [ТС] #10
JamesBlack, хоть это и не весь код, но даже целиком он, действительно, не так уж и велик. расставил точек и нашёл логическую ошибку. вообще не понятно как он раньше работал.
ISergey, благодарю за совет, но у меня вполне чёткое задание.
всем ещё раз спасибо за помощь
0
22.06.2010, 10:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2010, 10:52

Статическая библиотека к имеющейся программе
Ребят. Есть лаба (архив прложен к сообщению) Нужно сделать эту же лабу, только...

Статическая библиотека, error C1083
Создал библиотеку, скомпилировал. Создал второй проект, ссылающийся на...

Зачем нужны rvalue ссылки, если есть универсальные ссылки
Читаю книгу Скотта Мэйерса... Что-то я совсем запутался с этими rvalue...


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

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

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