Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонял конструкцию
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Dubov
Никак не могу понять что это и главное зачем так сложно?

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


а потом ещё

CODE
tENG_sysHndl sysHndl; //!< system service Handle
AHTOXA
Да, с непривычки выглядит весьма запутаноsm.gif
В первой строке объявляется тип - указатель на функцию с двумя параметрами (tENG_sysSer ser, const void * ptr), возвращающую void. Тип называется tENG_sysHndl.
А во второй строке определяется переменная этого типа. Теперь этой переменной можно присваивать указатели на функции такого вида.
Dubov
А можно поинтересоваться когда удобно так мудрёно делать?
Сергей Борщ
QUOTE (Dubov @ Dec 3 2012, 23:16) *
А можно поинтересоваться когда удобно так мудрёно делать?
Когда вам нужен указатель на функцию.
_Артём_
Цитата(Dubov @ Dec 3 2012, 23:16) *
А можно поинтересоваться когда удобно так мудрёно делать?

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

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

XVR
Цитата(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
demiurg_spb
Цитата(XVR @ Dec 4 2012, 12:46) *
Отличный пример!
sasamy
Цитата(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.
...



XVR
Цитата(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

sasamy
Цитата(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;
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.