Het volgende probleem is voornamelijk een kwestie van "hoe schrijf ik het netjes op". Ik heb werkende code, alleen geen erg mooie. Ik hoop dat jullie een netter alternatief weten.
Ik heb twee functies, funcA en funcB, die beurtelings elkaar aanroepen.
Van zowel funcA als funcB zijn er meerdere varianten, die allemaal met elkaar gecombineerd kunnen worden. Vooraf is niet bekend welke combinatie gebruikt zal worden. Daarom geef ik de functies mee als argumenten.
Mijn probleem is dat ik geen volledige types kan opgeven voor deze functies. Ze krijgen hun eigen definitie immers mee als argument, waardoor je in een circulaire zou definitie komen. Daarom heb ik, zoals je hierboven kan zien, de functies maar (impliciet) als void gedeclareerd. C is dom genoeg om het gewoon te slikken.
Allemaal mooi en prachtig, tot je een fout maakt. De compiler kan niet controleren hoeveel argumenten er nodig zijn, en doet dit ook niet. functieA en functieB kun je dus met zoveel (of weinig) argumenten aanroepen als je wil, de compiler vindt het allemaal prima. Werken doet het dan uiteraard niet.
Ik heb allerei pogingen gedaan om met structs en typedefs, maar heb niks kunnen bedenken.
PS1. Bijkomende wes is dat het in C90 werkt. Het project waar ik me op baseer is puur C90, en dat wil ik liever zou houden. Als je een heel elegante oplossing weet voor een andere C versie wil ik er nog wel naar kijken, maar C++ is geen optie.
PS2. De werkelijkheid is complexer, en er worden nog een hoop andere argumenten meegegeven.
Uit oogpunt van de leesbaarheid heb ik die in een struct geduwd. Ik zou het dus helemaal niet erg vinden als jouw oplossing ook een struct gebruikt. Hieronder de code met de struct en wat typdefs.
Ik heb twee functies, funcA en funcB, die beurtelings elkaar aanroepen.
Van zowel funcA als funcB zijn er meerdere varianten, die allemaal met elkaar gecombineerd kunnen worden. Vooraf is niet bekend welke combinatie gebruikt zal worden. Daarom geef ik de functies mee als argumenten.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| int funcA(int arg1, int (*functieA)(), int (*functieB)()) { iets; functieB(arg1, functieA, functieB); nog iets; } int funcB(int arg1, int (*functieA)(), int (*functieB)()) { doe iets; functieA(arg1, functieA, functieB); doe meer; } void main(int argc, char **argv) { funcA(0, funcA, funcB); } |
Mijn probleem is dat ik geen volledige types kan opgeven voor deze functies. Ze krijgen hun eigen definitie immers mee als argument, waardoor je in een circulaire zou definitie komen. Daarom heb ik, zoals je hierboven kan zien, de functies maar (impliciet) als void gedeclareerd. C is dom genoeg om het gewoon te slikken.
Allemaal mooi en prachtig, tot je een fout maakt. De compiler kan niet controleren hoeveel argumenten er nodig zijn, en doet dit ook niet. functieA en functieB kun je dus met zoveel (of weinig) argumenten aanroepen als je wil, de compiler vindt het allemaal prima. Werken doet het dan uiteraard niet.
Ik heb allerei pogingen gedaan om met structs en typedefs, maar heb niks kunnen bedenken.
PS1. Bijkomende wes is dat het in C90 werkt. Het project waar ik me op baseer is puur C90, en dat wil ik liever zou houden. Als je een heel elegante oplossing weet voor een andere C versie wil ik er nog wel naar kijken, maar C++ is geen optie.
PS2. De werkelijkheid is complexer, en er worden nog een hoop andere argumenten meegegeven.
Uit oogpunt van de leesbaarheid heb ik die in een struct geduwd. Ik zou het dus helemaal niet erg vinden als jouw oplossing ook een struct gebruikt. Hieronder de code met de struct en wat typdefs.
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| /* dit werkt niet: typedef int (*mijnFunctie)(int arg1, Settngs settings); */ /* dit wel: */ typedef int (*mijnFunctie)(); typedef struct Settings { mijnFunctie functieA; mijnFunctie functieB; int arg3; } Settings; int funcA(int arg1, Settings settings) { iets; settings.functieB(arg1, settings); nog iets; } int funcB(int arg1, Settings settings) { weer iets; settings.functieA(arg1, settings); nog meer iets; } int main(int argc, char **argv) { Setting settings; settings.functieA = funcA; settings.functieB = funcB; funcA(0, settings); } |
[ Voor 4% gewijzigd door CAPSLOCK2000 op 18-08-2009 19:31 . Reden: Conflicterende functienamen en argumenten hernoemd. ]
This post is warranted for the full amount you paid me for it.