[C] Pointer naar function pointer table

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een function pointer table met een aantal functies. Nu wil ik een functie aanroepen met een pointer naar deze table. Ik heb het volgende:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
static int (* const pf[])(void *pointer)  = 
{ 
    &functie1,
    &functie2,
    &functie3
};

void blaat(void * p_to_ftable)
{    
    (*pf[fselect])(pointer); //todo: use pointer from parameterlist          
}

blaat(&pf);


Ik heb zelf alleen dit kunnen vinden maar snap het niet helemaal.

Ik heb zelf dit geprobeerd:
C:
1
2
3
4
5
void blaat(void * p_to_ftable)
{    
    int (* const ftable)(void *pointer) = *(int (* const **)(void *pointer))p_to_ftable;
    ftable[fselect](pointer); 
}


Maar ik krijg op de eerste line een cannot convert error.

Weet iemand een goede site waar dit verder op uitgelegd staat of ziet iemand zo het probleem?

Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Het is alweer een tijdje geleden dat ik C heb gedaan, maar je kan het jezelf makkelijker kunnen maken door een typedef van je functiepointer te maken:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
typedef int (*pf)(void *); // typedef van pointer naar functie (pf)

static pf ftable[] = {     //array van type pf
    &functie1,
    &functie2,
    &functie3 
};

void blaat( pf my_ftable[] )  //argument van type array van pf
{
   int ret;
   ret = (*my_ftable[0])(pointer));
   ret = (*my_ftable[1])(pointer));
   ret = my_ftable[2](pointer);   //verkorte versie
} 

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15:26
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
typedef int (*ftype)(void *);

int functie1( void* p )
{
    return 1;
}

int functie2( void* p )
{
    return 2;
}

int functie3( void* p )
{
    return 3;
}

static ftype pf[] =
{
    &functie1,
    &functie2,
    &functie3
};

void blaat( ftype* p_to_ftable, int fselect, void* pointer )
{
    p_to_ftable[fselect](pointer);
}

int main( int argc, char* argv[] )
{
    blaat(pf, 0, 0 );
}


[edit]
@EddoH dat was idd de bedoeling :)

[ Voor 5% gewijzigd door farlane op 06-04-2012 14:19 ]

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • EddoH
  • Registratie: Maart 2009
  • Niet online

EddoH

Backpfeifengesicht

farlane geeft de complete versie :)
Maar dan zou ik het wel zo doen:
C:
1
2
3
4
void blaat( ftype* p_to_ftable, int fselect, void* pointer )
{
    p_to_ftable[fselect](pointer);
} 



(het is wel wat verwarrend dat jij de table pf noemt en ik de functiepointer pf)

[ Voor 79% gewijzigd door EddoH op 06-04-2012 13:51 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt! Ik ga hier maar is even mee aan de slag ;)

[edit]
farlane and EddoH bedankt voor de snelle reacties het werkt prachtig!

[ Voor 44% gewijzigd door Verwijderd op 06-04-2012 15:10 ]