AVR-GCC a pointer na funkci

Miroslav Sinko sinkomiro@rocketmail.com
Středa Leden 2 15:00:07 CET 2008


--- Jan Smrz <jan.smrz@honeywell.com> wrote:

> >> Skuste spravny zapis:
> >>
> >> void (* volatile reply_gen)(void);
> >>
> >> PS: http://kcomputing.com/answers.html :-)
>
> A vida, dekuji. Zkousel jsem ruzne zapisy toho volatile, ale toto me
> nenapadlo. 

No to funguje, pred poslanim som to overil na vasom priklade, prelozene
v GCC 4.2.2 s -O1 a -Os

  fa:	29 e4       	ldi	r18, 0x49	; 73
  fc:	30 e0       	ldi	r19, 0x00	; 0
  fe:	8b e4       	ldi	r24, 0x4B	; 75
 100:	90 e0       	ldi	r25, 0x00	; 0
 102:	18 9b       	sbis	0x03, 0	; 3
 104:	05 c0       	rjmp	.+10     	; 0x110 <main+0x28>
 106:	30 93 61 00 	sts	0x0061, r19
 10a:	20 93 60 00 	sts	0x0060, r18
 10e:	f9 cf       	rjmp	.-14     	; 0x102 <main+0x1a>
 110:	90 93 61 00 	sts	0x0061, r25
 114:	80 93 60 00 	sts	0x0060, r24
 118:	f4 cf       	rjmp	.-24     	; 0x102 <main+0x1a>


> Logika zapisu pointeru v C mi totiz pri slozitejsich
> zapisech
> nejak unika :-( Pri te prilezitosti bych se zeptal, jak by se
> zapsalo,
> kdybych mel promennou typu napr. long int a a promennou a bych chtel
> pretypovat jako pointer na fci s parametry void vracejici void?

Ja to kvoli svojej vlastnej prehladnosti riesim tak, ze si (spravidla v
headri) vytvorim typ pre pozadovany pointer na funkciu. Napr. typ
pointera na void fn(void):

typedef void (*fpFnc)(void);

pripadne zlozitejsi priklad z praxe :-)
typedef DWORD
APIENTRY(*fpRasGetSubEntryProperties)(LPSTR,LPSTR,DWORD,RASSUBENTRY*,LPDWORD,LPBYTE,LPDWORD,void*,void*,void*,void*);


Potom majme skutocny pointer na danu funkciu deklarovany:
fpFnc fpProc1;

a nejaku premennu:
unsigned long l;

Pretypovanie je jednoduche:
fpProc1 = (fpFnc)l;

miro





      ____________________________________________________________________________________
Be a better friend, newshound, and 
know-it-all with Yahoo! Mobile.  Try it now.  http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ 




Další informace o konferenci Hw-list