Вызов функции через агрумент (Вызов функции через агрумент)

Модератор: Модераторы разделов

Аватара пользователя
Eden
Сообщения: 14
ОС: openSUSE 10.3/KDE3.5

Вызов функции через агрумент

Сообщение Eden »

Подскажите пожалуйста как можно реализовать вот такую функцию на С:

допустим имеем не сколько функции

void test(void)
{
fprintf(stdout,"Hello test\n");
}

void test2(void)
{
fprintf(stdout,"Hello test2\n");
}

и что надо добавить что при передачи аргумента test выполнялась функция test ,а при аргументе test2 выполнялась test2


Сорри, если вопрос поставлен некорректно
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вызов функции через агрумент

Сообщение Zeus »

Не совсем понятно куда "надо добавить" и что такое "аргумент test" и "аргумент test2" но предположу, что указатели на функции спасут отца русской демократии...
Спасибо сказали:
Аватара пользователя
Eden
Сообщения: 14
ОС: openSUSE 10.3/KDE3.5

Re: Вызов функции через агрумент

Сообщение Eden »

а сам непонял что написал, короче принцип работы таков

1. структура в ней хранятся имя функции и адрес функции
2, функция main читает полученный аргумент argv[1] в переменную init_func
3. далее происходит поиск в структуре на имя init_func и возвращает адрес запрошенной функции
4, и наконец, выполняется функция которая находится по адресу

Вот такую я себе задачу поставил которую на Питоне писал, а на С не могу (так как в С всего пару дней ковыряюсь)
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вызов функции через агрумент

Сообщение Zeus »

Короче, задача банально на структуры данных.
В C++ ответ был бы однозначным: std::map.

А в C это нужно самому писать или может готовые либы есть...
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Вызов функции через агрумент

Сообщение MiK13 »

Может быть не полный вариант, но у меня работает

Код: Выделить всё

#include <stdio.h>
void test1(void) {
  fprintf(stdout,"Test 1\n");
}
void test2(void) {
  fprintf(stdout,"Test 2\n");
}
void test3(void) {
  fprintf(stdout,"Test 3\n");
}
void (*fun[3])() = {test1,test2,test3};
int main() {
  int i;
  for(i=0;i<3;i++)
    fun[i]();
  return 0;
}
Спасибо сказали:
MiK13
Сообщения: 1290
ОС: Linux Debian

Re: Вызов функции через агрумент

Сообщение MiK13 »

Предполагаю, что окончательным варианом может быть что-то вроде:

Код: Выделить всё

#include <stdio.h>
#include <string.h>
#define N_FUNC 3
void test1(void) {
  printf("Function Test varian 1\n");
}
void test2(void) {
  printf("Function Test varian 2\n");
}
void test3(void) {
  printf("Function Test varian 3\n");
}
struct {
  char name[8];
  void (*fn)();
} FunByName[N_FUNC] = {
   {"test1",test1},
   {"test2",test2},
   {"test3",test3},
  };
void (*func)();
void *FindFunc(const char *s) {
  int i;
  for(i=0;i<N_FUNC;i++)
    if(!strcasecmp(s,FunByName[i].name))
      return FunByName[i].fn;
  return NULL;
}
int main(int an, char **av) {
  if(an<2) {
    printf(" Use: %s function_name\n",av[0]);
    return 1;
  }
  if((func=FindFunc(av[1])))
    func();
  else
    printf(" Unknown function '%s'\n",av[1]);
  return 0;
}
Спасибо сказали:
Аватара пользователя
Zeus
Сообщения: 694

Re: Вызов функции через агрумент

Сообщение Zeus »

Структура данных выбрана неправильно.
Массив должен быть ассоциативным.
Спасибо сказали: