Как назначить адрес указателя функции согласно char *? - PullRequest
1 голос
/ 17 октября 2010

Я пишу программу на C, которую можно упростить, если мне удастся сделать что-то вроде этого:

int (*func)(int);
char* str= "adder";
func = str;
func(2);

Я создаю указатель на функцию char * и пытаюсь присвоить имяфункция указателя через этот символ *.В этом примере функция adder (int) существует.

Возможно ли это на самом деле?

Я знаю, что стандартным способом сделать это будет просто func = adder;, но это не решит проблемуЭто.

Большое спасибо!

Антонио

Ответы [ 4 ]

3 голосов
/ 17 октября 2010

Вы создаете таблицу так:

static const struct {
    char *name;
    int (*func)(int);
} map[] = {
    { "adder", adder },
    /* ... */
    { 0, 0 }
}

А затем используйте этот код:

for (i=0; map[i].name && strcmp(map[i].name, str); i++);
if (map[i].func) y = map[i].func(x);
else /* ... */
2 голосов
/ 17 октября 2010

Лучший способ, который я знаю, - поместить вашу функцию в динамическую библиотеку и использовать dlsym или эквивалент вашей операционной системы для получения указателя на вашу функцию. С другой стороны, вам придется каким-то образом настроить собственную карту из строки в указатель на функцию.

2 голосов
/ 17 октября 2010

Это не делает то, что я думаю, что вы думаете, что должно делать. Если вам удалось преобразовать "adder" в указатель на функцию, вы бы попытались выполнить фактический текст как функцию, а не то, что вам нужно. Вы можете хранить массивы указателей на функции, вы также можете сохранять отображение текста → указатель на функцию. Кроме того, нам нужно больше информации о том, что вы делаете.

1 голос
/ 17 октября 2010

Вы можете сделать что-то подобное, используя dll в окнах и функцию getprocaddress , но вам придется использовать только те функции, которые имеют одинаковую сигнатуру, или сохранять какое-то сложное отображение.Однако то, что вы пытаетесь сделать, требует дополнительной инфраструктуры.Если вы используете c ++, вы можете использовать карту для хранения отношений между строками и fnptrs.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...