[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űl
FLASH-ban, ez forditási idő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ő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ő: 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ő 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őle. Nem tilos ilyet csinálni, de
> nem tű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űnik,
hogy
> gépelést akarsz spórolni. Lehet, hogy nem kéne küzdeni a typedeffel,
hanem
> egyszerűen használni a makrót mindenütt. Ha meg nem vagy benne
biztos, hogy
> mire fejtődik ki, a preprocesszor eredményét mindig meg lehet nézni.
>
> Az is a preprocesszor eredményéből derül ki, hogy az, amit te
azonosnak
> gondolsz, ő í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