2017-06-01 2 views
0

Ich habe die folgende Struktur. Ich muss überprüfen, ob eine bestimmte Datei die angegebene Funktion enthält. Wenn ja, muss ich es ausführen. Ich bin neu in C. Wie könnten wir diesenSo verwenden Sie Funktionszeiger, um auf Funktionen aus mehreren Dateien zuzugreifen

struct { 
    char *filename; 
    char *funcname; 
    int (*funcptr)(); 
} symtab[] = { 
    { "filename1", "one_func", one_func }, 
    { "filename2", "two_func", two_func }, 
}; 

ich mit dem folgenden Code habe für Funktionen zu überprüfen, mit Funktionszeigern, ohne die Datei unter Berücksichtigung

int one_func(), two_func(); 
int (*findfunc(char *))(); 

struct { 
     char *name; 
     int (*funcptr)(); 
} symtab[] = { 
    { "one_func", one_func }, 
    { "two_func", two_func }, 
}; 

int (*findfunc(char *name))() 
{ 
    int i; 
    for (i = 0; i < sizeof(symtab)/sizeof(symtab[0]); i++) 
     { 
     if (strcmp(name, symtab[i].name) == 0) 
     return symtab[i].funcptr; 
     } 
    puts("function not defined"); 
    return NULL; 
} 

int one_func() 
{ 
    puts("one"); 
    return 0; 
} 

int two_func() 
{ 
    puts("two"); 
    return 0; 
} 

int main() 
{ 
    char *funcname = "two_func"; 
    int (*funcp)() = findfunc(funcname); 
    if (funcp != NULL) 
    (*funcp)(); 

    return 0; 
} 
+0

Während der Laufzeit? Verwenden Sie shared libraries '.dll' auf Windows -> benutzen' loadlibrary' und Freunde, '.so' auf linux -> benutzen' dlopen' und Freunde. Beispiele auf wikipedia (aus irgendeinem Grund) https://en.wikipedia.org/wiki/Dynamic_loading – Lanting

+2

Sieht aus wie ein [XY-Problem] (http://xyproblem.info/). Was versuchen Sie eigentlich? –

+0

BTW: Bitte Code richtig einrücken. –

Antwort

0

Dies ist ein einfacher Code, anrufen die Funktionen in sich im Betrieb eines "Mnemonic" -Namens. Sobald Sie diesen Code kompiliert haben, wird eine ausführbare Datei generiert. Diese ausführbare Datei benötigt zwei Eingabeparameter. Dann können Sie es in Ihrem Terminal als laufen:

prompt $ PRGNAME fnName Parm

wo:

  • PRGNAME ist der Name, den Sie die ausführbare Datei zu erhalten verwenden.

  • FnName ist der "mnemonic" Name, den Sie für die Funktion in die Struktur einfügen (Feld fnName des Strukturtyps definiert tSymTab).

  • parm ist ein Parameter (String), der an die Funktion übergeben wird, die mit dem Namen "mnemonic" aufgerufen werden soll.

Hier ist der Code:

#include <stdio.h> 
#include <string.h> 

/* 
    * parm may be used to send data to the function (void 
    * because data may be of different kinds) 
*/ 
typedef int tFn(void *parm); 

typedef struct symTab { 
    const char * fileName; 
    const char * fnName; //fnName shall be every name you want use to call the 
          //function pointed by fn 
    tFn * fn; 
} tSymTab; 

tFn * findFunc(const char * fnName); 
int func1(void *); 
int func2(void *); 

tSymTab symTab[]={ 
    {"f1.txt","func1",func1}, 
    {"f2.txt","func2",func2}, 

    // THIS MUST BE ALWAYS THE LAST LINE 
    {"","",NULL} 
}; 

int func1(void *parm) 
{ 
    char * value = (char *)parm; 

    printf("I'm in func1 --- the parm value is %s\n",value); 

    return 0; 
} 

int func2(void *parm) 
{ 
    char * value = (char *)parm; 

    printf("I'm in func2 --- the parm value is %s\n",value); 

    return 0; 
} 

tFn * findFunc(const char * fnName) 
{ 
    int idx=0; 

    while(symTab[idx].fn!=NULL && strcmp(symTab[idx].fnName,fnName)) 
     idx++; 

    return symTab[idx].fn; 
} 

int main(int argc, char *argv[]) 
{ 
    tFn * fn; 

    if (argc<3) { 
     printf("%s needs two input parameters:\n\n\tThe function name\n\n\ta simple text\n\n",argv[0]); 
     return 1; 
    } 

    fn=findFunc(argv[1]); 
    if (fn!=NULL) { 
     fn(argv[2]); 
    } else { 
     printf("The function name %s hasn't a corresponding function in this code!\n",argv[1]); 
    } 
    return 0; 
} 
+0

danke für die Unterstützung. Ich habe ein anderes scenarioi.My Szenario ist das func1 residiert in f1.txt und function2 inf2.txt. –

Verwandte Themen