8
votes

Exemples de table de saut en C

S'il vous plaît donnez-moi quelques exemples d'utilisation de la table de saut. J'ai vu cet exemple sur wikipedia: xxx

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 Jump_table [valeur] ();

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.

pour Exemple, disons que nous avons tous les pointeurs de fonction dans une structure. xxx

et maintenant quand je veux appeler la fonction puis-je faire quelque chose comme funcptrsc.func1 () ?


4 commentaires

"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.


3 Réponses :


7
votes

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;
}


2 commentaires

Eh bien, il pourrait 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.



8
votes

Vous pouvez certainement créer un struct contenant des pointeurs sur des fonctions. Il y a même de bonnes raisons de le faire.

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: xxx

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: xxx

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.


1 commentaires

+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.



0
votes

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


0 commentaires