PDA

Pogčedajte punu verziju : Oracle Forms Definicije Tipova


forrest13yu
20. 11. 2008., 18:53
Moze li neko da mi objsni ovo(detaljno):

typedef struct d2fctx d2fctx;

typedef dvoid *(* d2fmalc) (d2fctx *context, size_t size);
typedef dvoid *(* d2fmrlc) (d2fctx *context, dvoid *ptr, size_t newsize);
typedef void (* d2fmfre) (d2fctx *context, dvoid *ptr);


struct d2fctx
{
dvoid *pidgc_d2fctx; /* Builder context */
dvoid *cdata_d2fctx; /* Client Data */
d2fmalc d2fmalc_d2fctx; /* Client provided malloc */
d2fmfre d2fmfre_d2fctx; /* Client provided free */
d2fmrlc d2fmrlc_d2fctx; /* Client provieded realloc */
};

kod je uzet iz d2fpriv.h
a dvoid je void *dvoid tip.

cvele
21. 11. 2008., 09:48
Ne znam kakve ovo veze ima sa sql-om, oracle ili bilo cime sa te strane univerzuma... meni ovo lici na c. Si siguran da znas sta hoces da pitas ?

filmil
21. 11. 2008., 10:42
typedef struct d2fctx d2fctx;


Дефинише нови тип, који се зове d2fctx, а који је представљен структуром која има истоимену ознаку (tag) struct d2fctx.


typedef dvoid *(* d2fmalc) (d2fctx *context, size_t size);

Дефинише нови тип који се зове d2fmalc, а који представља:
- поинтер на функцију
- која као параметре узима:
-- поинтер по имену context на претходно дефинисан тип d2fctx,
-- ознаку за величину типа size_t.
- и враћа поинтер на тип dvoid.


typedef dvoid *(* d2fmrlc) (d2fctx *context, dvoid *ptr, size_t newsize);

Дефинише нови тип који се зове d2fmrlc, а који представља:
- поинтер на функцију
- која као параметре узима:
-- поинтер по имену context на претходно дефинисан тип d2fctx,
-- поинтер по имену ptr на тип dvoid.
-- ознаку по имену newsize за величину типа size_t.
- и враћа поинтер на тип dvoid.


typedef void (* d2fmfre) (d2fctx *context, dvoid *ptr);

Дефинише нови тип који се зове d2fmfre, а који представља:
- поинтер на функцију
- која као параметре узима:
-- поинтер по имену context на претходно дефинисан тип d2fctx,
-- поинтер по имену ptr на тип dvoid.
- и враћа поинтер на тип dvoid.


struct d2fctx
{
dvoid *pidgc_d2fctx; /* Builder context */
dvoid *cdata_d2fctx; /* Client Data */
d2fmalc d2fmalc_d2fctx; /* Client provided malloc */
d2fmfre d2fmfre_d2fctx; /* Client provided free */
d2fmrlc d2fmrlc_d2fctx; /* Client provieded realloc */
};


Ово је структура у којој се налазе два поинтера на тип dvoid на некакве „контексте“, и три поинтера на функције, типова дефинисаних у декларацијама изнад.

Ово је несрећни цеовски начин за нешто што се у објектно-оријентисаним језицима зове убризгавање зависности („dependency injection“) и представља начин да се бибилиотеци проследе корисничке функције.

У објектно оријентисаним језицима би се овај исти проблем решио наслеђивањем или убризгавањем зависности. У јави на пример, горепоменута структура постала би интерфејс (interface), а кориснички код би имплементирао (implement) тај интерфејс и преиначио (overload) функције по жељи.

Познатији пример употребе сличног механизма у Ц-у су униксове операције са датотекама — сваки систем датотека (filesystem) попуњава структуру са поинтерима на функције које изводе стандардне операције над датотекама. Пример како то изгледа у линуксовом кернелу. (http://www.linux-m32r.org/lxr/http/source/include/linux/fs.h#L1113)

ф