Toon posts:

[C] Functionpointers

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in Visual Studio een testprogje gemaakt die werkt met een functie pointer.

#include "stdargs.h"

void (*pfunc)(...);

pfunc krijgt achtereenvolgend adressen van drie functies
die zo aangeroepen worden.

pfunc();
pfunc(20);
pfunc(20, "test");

Dit werkt goed. :)

Nu wil ik dit toepassen op een embedded ARM systeem. Hiervoor gebruik ik een ADS compiler. Deze werkt met ANSI C.
Nu geeft deze compiler een error op ... in de functiepointer declaratie. :?
Vervolgens laat ik de puntjes weg.

void(*pfunc)();

Nu geeft de compiler geen error meer. Ook niet op feit dat ik toch 2 functies met deze pointer aanroep, die meer parameters meekrijgen. :?
Ook dit werkt wel: void(*pfunc)(int,...);

Kan ANSI C wel overweg met void(*pfunc)(...); ?

Weet iemand wat ik verkeerd doe of wat de ADS compiler misschien verkeerd doet?

Verwijderd

void func(...) betekent dat je helemaal niets weet over de parameters, zelfs niet hoeveel parameters de functie krijgt.

Dit noteert men in ANSI C als void func(). Dit betekent dus niet dat een functie geen parameters krijgt, maar een onbekend aantal parameters. Een functie zonder parameters schrijf je in ANSI C als void func(void). Merk dus op dat dit anders is als in C++, waar void func() wel een functie zonder parameters betekent.

Maw. de ADS compiler doet het goed, en MSVC doet het fout (als je het idd als C en niet als C++ compileert).

Verwijderd

Topicstarter
Dit is het antwoord waar ik op hoopte. Ik had al lang gezocht naar dit.
Bedankt.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 18:57
Op vrijdag 21 juni 2002 11:32 schreef mietje het volgende:
void func(...) betekent dat je helemaal niets weet over de parameters, zelfs niet hoeveel parameters de functie krijgt.

Dit noteert men in ANSI C als void func(). Dit betekent dus niet dat een functie geen parameters krijgt, maar een onbekend aantal parameters. Een functie zonder parameters schrijf je in ANSI C als void func(void).

Maw. de ADS compiler doet het goed, en MSVC doet het fout (als je het idd als C en niet als C++ compileert).
Sorry, niet waar.
Ook in C is void func( ... ) is iets anders als void func ( ).
Met een declaratie void func(...) wordt de vararg conventie gebruikt, bij void func ( ) de gewone. In het eerste geval worden shorts gepromoveerd, in het tweede geval niet. Het eerste signature is niet acceptabel voor de definitie
void func( int a ) { ; }, de tweede is wel een valide declaratie van func(int a); De eerste functie mag met 1 [b] en[b] 2 parameters worden aangeroepen; de tweede mag alleen met het correcte (maar lokaal onbekende) aantal parameters worden aangeroepen.

Nou is het afhankelijk van de compiler wat het verschil is tussen de vararg call sequence en de gewone, dus dit soort fouten geven i.h.a. onvoorspelbare resultaten.

In elk geval is de originele code goed, en verplicht voor de call sequence. Als je de ( ) vorm gebruikt zijn tenminste twee van de drie calls fout vanwege een fout aantal elementen; je weet alleen niet welke.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

MSalters>> Sorry, maar je verhaal klopt niet.

void func(...) is geen geldig prototype in ANSI C; en void func() accepteert een willekeurig aantal parameters in ANSI C (zonder typeconversie).

Merk op dat het hier om een incompatibiliteit tussen ANSI C en C++ gaat.

De originele code is dus geen correcte ANSI C, en de tweede poging doet exact wat jw.oosting wil. (Zie bv. hier, hier of google op "ANSI C ellipses".)