Подскажите пожалуйста как можно реализовать вот такую функцию на С:
допустим имеем не сколько функции
void test(void)
{
fprintf(stdout,"Hello test\n");
}
void test2(void)
{
fprintf(stdout,"Hello test2\n");
}
и что надо добавить что при передачи аргумента test выполнялась функция test ,а при аргументе test2 выполнялась test2
Сорри, если вопрос поставлен некорректно
Вызов функции через агрумент (Вызов функции через агрумент)
Модератор: Модераторы разделов
-
Zeus
- Сообщения: 694
Re: Вызов функции через агрумент
Не совсем понятно куда "надо добавить" и что такое "аргумент test" и "аргумент test2" но предположу, что указатели на функции спасут отца русской демократии...
-
Eden
- Сообщения: 14
- ОС: openSUSE 10.3/KDE3.5
Re: Вызов функции через агрумент
а сам непонял что написал, короче принцип работы таков
1. структура в ней хранятся имя функции и адрес функции
2, функция main читает полученный аргумент argv[1] в переменную init_func
3. далее происходит поиск в структуре на имя init_func и возвращает адрес запрошенной функции
4, и наконец, выполняется функция которая находится по адресу
Вот такую я себе задачу поставил которую на Питоне писал, а на С не могу (так как в С всего пару дней ковыряюсь)
1. структура в ней хранятся имя функции и адрес функции
2, функция main читает полученный аргумент argv[1] в переменную init_func
3. далее происходит поиск в структуре на имя init_func и возвращает адрес запрошенной функции
4, и наконец, выполняется функция которая находится по адресу
Вот такую я себе задачу поставил которую на Питоне писал, а на С не могу (так как в С всего пару дней ковыряюсь)
-
Zeus
- Сообщения: 694
Re: Вызов функции через агрумент
Короче, задача банально на структуры данных.
В C++ ответ был бы однозначным: std::map.
А в C это нужно самому писать или может готовые либы есть...
В C++ ответ был бы однозначным: std::map.
А в C это нужно самому писать или может готовые либы есть...
-
MiK13
- Сообщения: 1290
- ОС: Linux Debian
Re: Вызов функции через агрумент
Может быть не полный вариант, но у меня работает
Код: Выделить всё
#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: Вызов функции через агрумент
Предполагаю, что окончательным варианом может быть что-то вроде:
Код: Выделить всё
#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: Вызов функции через агрумент
Структура данных выбрана неправильно.
Массив должен быть ассоциативным.
Массив должен быть ассоциативным.