tablica wskaźników funkcji

0

Chciałem zrobić tablice wskaźników funkcji, ale nie mogłem nigdzie przeczytać jak to zrobić

Kod(fragment)

while (dalej)
	{
		znak = getc(stdin);

		if (znak == 'M') suma_kol(n,m,tab);
		else if (znak == 'N') suma_wie(n,m,tab);
		else if (znak == 'O') el_min(n,m,tab);
		else if (znak == 'P') czy_najw(n,m,tab);
		else if (znak == 'R') zera(n,m,tab);
		else if (znak == 'Q') dalej = false;

Zrobiłem tak, ale to zapewne nie jest dobrze

void(*TabFun[5])(int n, int m, **tab) = { suma_kol, suma_wie, el_min, czy_najw, zera };
	while (dalej)
	{
		znak = getc(stdin);
		if (znak == 'M') TabFun[0](int n, int m, **tab);
		else if (znak == 'N') TabFun[1](int n, int m, **tab);
		else if (znak == 'O') TabFun[2](int n, int m, **tab);
		else if (znak == 'P') TabFun[3](int n, int m, **tab);
		else if (znak == 'R') TabFun[4](int n, int m, **tab);
		else if (znak == 'Q') dalej = false;
1
void(*TabFun[5])(int n, int m, **tab)

Prawie dobrze, brakuje typu trzeciego argumentu oraz nie powinieneś podawać nazw parametrów.

Dobrze:

void(*TabFun[5])(int, int, char**)

Przy okazji polecam cdecl.org: http://cdecl.ridiculousfish.com/?q=void%28*TabFun[5]%29%28int%2C+int%2C+char**%29

5

swoją drogą możesz napisać coś takiego:

int idx = znak - 'M';
if (idx >= 0 && idx < 5)
{
  TabFun[idx](n, m, tab);
}
else
{
  cout << "blad" << endl;
}
0

Jeżeli litery są po kolei to tak jak napisał wyżej @krwq, jeżeli nie to może lepiej tak:

#include <iostream>
#include <unordered_map>
using namespace std;

void suma_kol(int n,int m,int **tab)
  {
   cout<<"suma_kol"<<endl;
  }
  	
void suma_wie(int n,int m,int **tab)
  {
   cout<<"suma_wie"<<endl;
  }

void el_min(int n,int m,int **tab)
  {
   cout<<"el_min"<<endl;
  }

void czy_najw(int n,int m,int **tab)
  {
   cout<<"czy_najw"<<endl;
  }

void zera(int n,int m,int **tab)
  {
   cout<<"zera"<<endl;
  }

typedef void MyFun(int n,int m,int **tab);
unordered_map<char,MyFun*> tb=
  {
   {'M',&suma_kol},
   {'N',&suma_wie},
   {'O',&el_min},
   {'P',&czy_najw},
   {'Q',&zera},
  };

int main()
  {
   int v,*pv=&v;
   tb['M'](1,1,&pv);
   tb['N'](1,1,&pv);
   tb['O'](1,1,&pv);
   tb['P'](1,1,&pv);
   tb['Q'](1,1,&pv);
   return 0;
  }

http://ideone.com/IchGY4

0

krwq dzięki za pomoc ! :)

tylko nie wiem czemu program mi się wykonuje bez podania char znak;

dobrze napisany jest, bo jeżeli zamiast mojego

scanf_s("%c", &znak)

dam

cin >> znak

to działa normalnie i program oczekuje na wpisanie tego znaku

1
scanf_s(" %c",&znak); // dodatkowa spacje, można również samodzielnie pomijać białe znaki

1 użytkowników online, w tym zalogowanych: 0, gości: 1