реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Непонял конструкцию, объясните пожалуйста
Dubov
сообщение Dec 3 2012, 17:53
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



Никак не могу понять что это и главное зачем так сложно?

CODE
//! System service Handle (call back function)
typedef void ( * tENG_sysHndl ) (tENG_sysSer ser, const void * ptr ) ;


а потом ещё

CODE
tENG_sysHndl sysHndl; //!< system service Handle
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Dec 3 2012, 18:53
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Да, с непривычки выглядит весьма запутаноsm.gif
В первой строке объявляется тип - указатель на функцию с двумя параметрами (tENG_sysSer ser, const void * ptr), возвращающую void. Тип называется tENG_sysHndl.
А во второй строке определяется переменная этого типа. Теперь этой переменной можно присваивать указатели на функции такого вида.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Dubov
сообщение Dec 3 2012, 21:16
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 408
Регистрация: 28-05-12
Пользователь №: 72 052



А можно поинтересоваться когда удобно так мудрёно делать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 3 2012, 23:18
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Dubov @ Dec 3 2012, 23:16) *
А можно поинтересоваться когда удобно так мудрёно делать?
Когда вам нужен указатель на функцию.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Dec 3 2012, 23:37
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Dubov @ Dec 3 2012, 23:16) *
А можно поинтересоваться когда удобно так мудрёно делать?

Например, ваша программа будет работать под управлением ОС (Linux?), и система предоставляет вам возможность при возникновении некоего своего события вызвать любую заданную вами функцию, которую к тому же, можно менять в ходе выполнения вашей программы. Это называется
Цитата
call back function

(как и написано в коментарии).

Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 4 2012, 08:46
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(Dubov @ Dec 3 2012, 21:53) *
Никак не могу понять что это и главное зачем так сложно?
Это разве сложно? rolleyes.gif
Вот, прототип функции signal из Linux'а (да и вообще из любого Unix'а) -
Код
void (*signal(int sig, void (*func)(int)))(int);

Вот чтобы в частности таких монстров не было, typedef'ы и применяют:
Код
typedef void (*SigHandler)(int);

SigHandler signal(int sig, SigHandler func);
- прототип аналогичный вышеуказанному ужасу biggrin.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Dec 4 2012, 08:56
Сообщение #7


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(XVR @ Dec 4 2012, 12:46) *
Отличный пример!


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 4 2012, 09:51
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(XVR @ Dec 4 2012, 12:46) *
Вот, прототип функции signal из Linux'а


ну непрада же это sm.gif

man 2 signal

Цитата
SIGNAL(2) Linux Programmer's Manual SIGNAL(2)

NAME
signal - ANSI C signal handling

SYNOPSIS
#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

DESCRIPTION
The behavior of signal() varies across Unix versions, and has also varied historically across different versions
of Linux. Avoid its use: use sigaction(2) instead. See Portability below.
...



Go to the top of the page
 
+Quote Post
XVR
сообщение Dec 5 2012, 08:44
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 3 123
Регистрация: 7-04-07
Из: Химки
Пользователь №: 26 847



Цитата(sasamy @ Dec 4 2012, 13:51) *
ну непрада же это sm.gif

man 2 signal

Правда правда:
Цитата
SIGNAL(3P) POSIX Programmer's Manual SIGNAL(3P)



PROLOG
This manual page is part of the POSIX Programmer's Manual. The Linux implementation of this interface may differ (consult the corresponding
Linux manual page for details of Linux behavior), or the interface may not be implemented on Linux.

NAME
signal - signal management

SYNOPSIS
#include <signal.h>

void (*signal(int sig, void (*func)(int)))(int);
...


Цитата
LinuxSET EC Image SLES10SP3-3 Revision 0 ia32e -- SUSE Linux Enterprise Server 10 (x86_64)
Kernel 2.6.16.60-0.58.1.3835.0.PTF.638363-smp

Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 5 2012, 11:16
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(XVR @ Dec 5 2012, 12:44) *
Правда правда:
SIGNAL(3P) POSIX Programmer's Manual SIGNAL(3P)


под Linux можно читать хоть мануалы венды sm.gif

Цитата
sasa@sasa-laptop:~$ cpp /usr/include/signal.h | grep sighandler_t
typedef void (*__sighandler_t) (int);
extern __sighandler_t __sysv_signal (int __sig, __sighandler_t __handler)
extern __sighandler_t signal (int __sig, __sighandler_t __handler)
extern __sighandler_t ssignal (int __sig, __sighandler_t __handler)
typedef __sighandler_t sig_t;
__sighandler_t sa_handler;
__sighandler_t sv_handler;
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 13:39
Рейтинг@Mail.ru


Страница сгенерированна за 0.01443 секунд с 7
ELECTRONIX ©2004-2016