Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 13:10     Статическая библиотека и ссылки на процедуры #1
Доброе время суток. Столкнулся с проблемой: необходимо из метода класса в статической библиотеке обратиться к процедуре, описанной вне библиотеки.
не могу понять как правильно инициализировать ссылку на процедуру в класса, как обращаться к ней из метода и как работать с ней в программе.
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) так ли использовать её в программе?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.06.2010, 13:10     Статическая библиотека и ссылки на процедуры
Посмотрите здесь:

Статическая или динамическая библиотека C++
C++ Статическая переменная
Ошибки,статическая библиотека C++
C++ Статическая библиотека, error C1083
Статическая линковка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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 & );
и уже ей пользоваться, либо просто хедер подключить библиотеки
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 &)""
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
21.06.2010, 14:15     Статическая библиотека и ссылки на процедуры #4
метод, совпадающий с именем класса будет являться конструктором. разве описываемая процедура имеет к этому отношение?
я это к тому, что когданибудь инициализировать указатель надо будет, например в конструкторе
Цитата Сообщение от SentineL-88 Посмотреть сообщение
"void (__cdecl *)(int &)" в "void (__cdecl *)(int &,int &)""
Цитата Сообщение от SentineL-88 Посмотреть сообщение
void (*Gen)(int &);
у вас разные описания, видать Gen - (*Gen*)(int&,int&) - от двух параметров описан
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 14:40  [ТС]     Статическая библиотека и ссылки на процедуры #5
да, точно =) мог бы и сам разобраться. ещё раз спасибо.
PS я так понимаю, в MyProg.cpp использовать имя "_Ger" (при такой инициализации) для описания процедуры?
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
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 переменная параметр конструктора всего для инициализации
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;" везде где ни попадя (по-деревенски, но что поделать...), вообще представления не имею по какому принципу совершаются обходы циклов после введения указателей на процедуры.
JamesBlack
 Аватар для JamesBlack
36 / 36 / 3
Регистрация: 28.07.2009
Сообщений: 144
22.06.2010, 03:39     Статическая библиотека и ссылки на процедуры #8
SentineL-88, расставь точки останова, или вообще пошагово иди. У тебя код небольшой, вполне реально.
ISergey
Maniac
Эксперт С++
 Аватар для ISergey
1331 / 864 / 50
Регистрация: 02.01.2009
Сообщений: 2,622
Записей в блоге: 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;
}
Как на меня это проще...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2010, 10:52     Статическая библиотека и ссылки на процедуры
Еще ссылки по теме:

C++ Статическая библиотека к имеющейся программе
C++ Статическая линковка
C++ Статическая библиотека MVS errorLNK1120

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

Или воспользуйтесь поиском по форуму:
SentineL-88
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 10:52  [ТС]     Статическая библиотека и ссылки на процедуры #10
JamesBlack, хоть это и не весь код, но даже целиком он, действительно, не так уж и велик. расставил точек и нашёл логическую ошибку. вообще не понятно как он раньше работал.
ISergey, благодарю за совет, но у меня вполне чёткое задание.
всем ещё раз спасибо за помощь
Yandex
Объявления
22.06.2010, 10:52     Статическая библиотека и ссылки на процедуры
Ответ Создать тему
Опции темы

Текущее время: 02:49. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru