[elektro] 2nd C typedef kérdés

hg12345 hg12345 at freemail.hu
Fri Apr 25 18:07:30 CEST 2008


Palasik Sandor <palasik at mail.datanet.hu> írta:

> > Mivel nem tudok a struct/union-ban sajátmagára hivatkozó typedef
> > definiciót használni, (valószinüleg forditás kifejtési sorrendje
> > okozza)
> 

Nem teljesen erre gondoltam.
A lényeg van egy lista amit const-ként  tárolok. (teljesen véletlen&#369;l 
FLASH-ban, ez forditási id&#337;ben keletkezik). A lista mérete és a FLASH 
mérete miatt egy struct/union szerkezetben vannak az adaok tárolva. 
Egyes esetekben az szükséges leírók még forditási id&#337;ben 
meghatározhatók, mig más esetekben ezt futásközben egy program 
segitségével tudom meghatározni. A tömörség miatt az öröklödést 
meghatározó program cime az tulajdonságok helyén található (elfér).
A müködés a következ&#337;: az index alapján beolvasom a leírást, majd ha 
szükséges meghívom a programot ami a meghívási cím helyére 
elhelyezi a tulajdonságokat.
Itt válaszolnék a kérdésedre a function pointer meghatározás nem 
gépelés megtakaritás miatt szükséges (ugyan annak néz ki), hanem a 
hordozhatóság miatt kell, az öröklödést biztosító program részleteket 
is definiálnom kell, mint extern és mint függvény. Ha ezt egy közös 
definicióval tudom megtenni, akkor minden módosítás automatikusan 
minden helyen megjelenik, mig ha külön-külön definiálok mindent, akkor 
egy esetleges változtatás esetén egy halom problémával kell 
szembenéznem.

Amit a GNU-C 4.02 nem tudott megemészteni (alias MPLAB C30 V3.02c)

#define	_CONDFUNC(x)  	void (x)(union tagITEMu *p ) 
//ha elötte typedef meghatározás, akkor az unionnal volt problémája..
//typedef	_CONDFUNC (condfunc_t);	//függvény meghatározása
//typedef	condfunc_t * pcondfunc_t;	//függvény pointer 

typedef union tagITEMu{
	uint16_t		W4th;	//minden 
	_CONDFUNC(*pF);	//ez OK!
//              condfunc_t *pF1;    // ez már hibás volt
//              pcondfunc_t pF2;   //mint az elöz&#337; hibás
} ITEMu_t, * pITEMu_t;


typedef	_CONDFUNC (condfunc_t);	//függvény meghatározása
typedef	condfunc_t * pcondfunc_t;	//függvény pointer 


A typedef elötte esetben a unionnal volt problémája, mögötte esetén 
meg nem volt hajlandó megcsinálni a függvény pointer, de nem egy 
hanem egy halom hibát generált. A #define-s megoldás mint irtam 
megoldotta a problémámat már a levél irás elött, de érdekel hogy ezek 
a megoldások miert nem fekszenek a forditónak.... ís define nem 
okozott problémát ugyan most egy kicsit nehezebben olvashatóvá 
teszi a kódot.

   üdv
           Gábor

> Arra gondolsz, hogy mondjuk a
> 
> typedef struct valami_struct {
>     valami_typedef *ptr;
>     }  valami_typedef;
> 
> nem fordul le?
> 
> Mert ezt úgy meg lehet oldani, hogy:
> 
> typedef struct valami_struct valami_typedef;
> 
> struct valami_struct {
>     valami_typedef *ptr;
>     } ;
> 
> De akár úgy is, hogy
> 
> typedef struct valami_struct {
>     struct valami_struct *ptr;
>     }  valami_typedef;
> 
> > _CONDFUNC(CondAlr) {}
> > ez lefordul és müködik is.
> >
> > azt gondoltam az alábbi definició azonos a fentivel:
> > condfunc_t CondAlr(union tagITEMu *p ) {}
> > Ez komoly hibát generál és nem fordul le.
> 
> Nem azonos, mert a condfunc_t az maga egy függvény típus. Ebben a
> szintaxisban viszont a condfunc_t a visszatérési érték, úgyhogy a 
fordító
> panaszkodik, hogy függvényt akarsz visszaadni, ami nem megy, de 
gondolom,
> hogy nem is ezt akarod.
> 
> Én nem láttam még hasznát a függvénytípusnak, mint typedefnek, 
mert egyedül
> arra jó, hogy pointertípust csináljak bel&#337;le. Nem tilos ilyet csinálni, de
> nem t&#369;nik hasznosnak sem :-)
> 
> > Ezzel szemben a
> > pcondfunc_t CondAlr(union tagITEMu *p ) {}
> 
> Igen, mert ez függvénypointert ad vissza. Pointert lehet, egész 
függvényt
> nem.
> 
> Nem látom, hogy milyen feladatot akarsz megoldani, de úgy t&#369;nik, 
hogy 
> gépelést akarsz spórolni. Lehet, hogy nem kéne küzdeni a typedeffel, 
hanem 
> egyszer&#369;en használni a makrót mindenütt. Ha meg nem vagy benne 
biztos, hogy 
> mire fejt&#337;dik ki, a preprocesszor eredményét mindig meg lehet nézni.
> 
> Az is a preprocesszor eredményéb&#337;l derül ki, hogy az, amit te 
azonosnak 
> gondolsz, &#337; így értelmezi:
> 
> void(CondAlr)(union tagITEMu *p ) {}
>           illetve
> condfunc_t CondAlr(union tagITEMu *p ) {}
> 
> Palasik Sándor
> 
> -----------------------------------------
>           elektro[-flame|-etc]
> 

________________________________________________________
Papírképek akár ingyen! Digitális fényképezőgépek már 5000 Ft ajándék fotókidolgozással a FotoMarket Online Fotóáruházban! http://ad.adverticum.net/b/cl,1,6022,99786,162268/click.prm



More information about the Elektro mailing list