S'il vous plaît donnez-moi quelques exemples d'utilisation de la table de saut. J'ai vu cet exemple sur wikipedia: mais je me demandais s'il existe une autre façon d'appeler la fonction au lieu d'utiliser l'index comme indiqué, dans le cas ci-dessus, il est Ce que je veux réaliser est, au lieu d'utiliser l'index, il existe un moyen d'utiliser le nom de la fonction elle-même. P> pour Exemple, disons que nous avons tous les pointeurs de fonction dans une structure. p> et maintenant quand je veux appeler la fonction puis-je faire quelque chose comme Jump_table [valeur] (); code> p> funcptrsc.func1 () code>? p> p>
3 Réponses :
Certainement, mais vous devez les déclarer comme des pointeurs de fonction et les initialiser en premier. Bien que cela défait le but d'une table de saut si vous devez épeler le nom de la fonction.
EG P>
#include <stdio.h>
#include <string.h>
void func1 (void) { printf( "1\n" ); }
void func0 (void) { printf( "0\n" ); }
#define DEFUN(name) { #name, name }
typedef struct
{
const char *name;
void (*func)(void);
} funcptrs;
void call(funcptrs *ptrs, const char *name)
{
int i;
for(i = 0; ptrs[i].name; i++) {
if(strcmp(ptrs[i].name, name) == 0) {
ptrs[i].func();
break;
}
}
}
int main(int argc, char *argv[])
{
funcptrs funcs[] = {DEFUN(func0), DEFUN(func1), {NULL,NULL}};
call(funcs, "func0");
return 0;
}
Eh bien, il pourrait I> de sens: si vous avez des instances différentes de la structure, par exemple, pour mettre en œuvre une sorte de table de fonction virtuelle.
C'est moche. Aller avec des blocs à la place.
Vous pouvez certainement créer un Pour un exemple, considérez l'interface entre un système d'exploitation et un pilote de périphérique de quelque sorte. Simplifier beaucoup, cela pourrait regarder quelque chose sur cette commande: p> puis un pilote de périphérique individuel créerait une structure de ce type et initialiserait les pointeurs individuels pour se référer aux fonctions. pertinent pour un périphérique particulier: p> puis une fonction de niveau plus élevé peut recevoir l'une de ces personnes et ouvrir / fermer / écrire / écrire un appareil sans avoir à connaître l'identité exacte de l'appareil impliqué. Bien sûr, pour un système d'exploitation réel, il devient un peu plus complexe que cela, mais l'idée générale est (ou du moins peut être) assez similaire. P> p> struct code> contenant des pointeurs sur des fonctions. Il y a même de bonnes raisons de le faire.
+1 - C'est très proche de ce que je pense que la puissance est posée. C'était une technique normale dans les années 80 lorsque nous avons convaincu les fonctions virtuelles C ++, mais uniquement c sur PC.
Vous pouvez utiliser une énorme pour représenter les indices de votre tableau et leur donner des noms significatifs pour vous.
0 1 2 3
"L'utilisation de l'index existe un moyen d'utiliser le nom de la fonction elle-même" Ce que vous recherchez est une langue de niveau supérieur ou une table de hachage. La table de hachage serait une chaîne -> pointeur de fonction.
Si vous souhaitez appeler avec le nom de la fonction elle-même, alors pourquoi avez-vous besoin d'une table de saut en premier lieu?
Je n'ai pas réellement lu votre dernier exemple, et maintenant que je viens de le faire, je crois que @pavanmanjunath a un point. Qu'est-ce que vous essayez de faire exactement? J'ai supposé que vous vouliez prendre un char * et appeler une fonction basée sur elle. Comme comment PHP, vous pouvez faire $ FUNC = "Strtolower"; echo $ func ('corbin') ;.
Pourquoi voudriez-vous? Qu'est-ce qui vous gagnerait, mais un autre niveau d'indirection? Et ce que vous proposez n'est plus une table de saut.