Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
1

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

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

Author24 — интернет-сервис помощи студентам
Доброе время суток. Столкнулся с проблемой: необходимо из метода класса в статической библиотеке обратиться к процедуре, описанной вне библиотеки.
не могу понять как правильно инициализировать ссылку на процедуру в класса, как обращаться к ней из метода и как работать с ней в программе.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2010, 13:10
Ответы с готовыми решениями:

Статическая библиотека
Имеется статическая библиотека, которая подключается к основной программе. Необходимо максимально...

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

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

Статическая библиотека на Fortran
Есть код на фортране. Мне нужно собрать его в статическую библиотеку lib. Далее эта библиотека...

9
бжни
2473 / 1684 / 135
Регистрация: 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
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
бжни
2473 / 1684 / 135
Регистрация: 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
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
21.06.2010, 14:40  [ТС] 5
да, точно =) мог бы и сам разобраться. ещё раз спасибо.
PS я так понимаю, в MyProg.cpp использовать имя "_Ger" (при такой инициализации) для описания процедуры?
0
бжни
2473 / 1684 / 135
Регистрация: 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
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
46 / 46 / 5
Регистрация: 28.07.2009
Сообщений: 144
22.06.2010, 03:39 8
SentineL-88, расставь точки останова, или вообще пошагово иди. У тебя код небольшой, вполне реально.
1
Maniac
Эксперт С++
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 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
1 / 1 / 0
Регистрация: 21.06.2010
Сообщений: 23
22.06.2010, 10:52  [ТС] 10
JamesBlack, хоть это и не весь код, но даже целиком он, действительно, не так уж и велик. расставил точек и нашёл логическую ошибку. вообще не понятно как он раньше работал.
ISergey, благодарю за совет, но у меня вполне чёткое задание.
всем ещё раз спасибо за помощь
0
22.06.2010, 10:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.06.2010, 10:52
Помогаю со студенческими работами здесь

Статическая библиотека в QT5
Будучи новичком в QT, прошу помощи у уважаемого сообщества, в вопросе создания статической...

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

Статическая библиотека VS2017
Здравствуйте, Подскажите пожалуйста, можно ли, и если можно то как в VS2017 собрать статическую...

Расширение файла (.a). Статическая библиотека
Здравия, пингвины! :p Я пришел из мира Windows, где статические библиотеки имеют расширение .lib...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru