Я работаю над проектом, в котором мне нужно реализовать обработчик для нескольких функций, каждая из которых имеет номер, связанный с ними. Число, с которым они связаны, - это то, как называются различные функции. Зная это, я хочу иметь возможность сгруппировать их в массив, используя номер в качестве индекса для функций. Проблема в том, что в массивах должны быть элементы одного типа, верно? так как я могу поместить эти функции в массив?
Вот как нумеруются функции:
enum
{
SYS_HALT, /* Halt the operating system. */
SYS_EXIT, /* Terminate this process. */
SYS_EXEC, /* Start another process. */
SYS_WAIT, /* Wait for a child process to die. */
SYS_CREATE, /* Create a file. */
SYS_REMOVE, /* Delete a file. */
SYS_OPEN, /* Open a file. */
SYS_FILESIZE, /* Obtain a file's size. */
SYS_READ, /* Read from a file. */
SYS_WRITE, /* Write to a file. */
SYS_SEEK, /* Change position in a file. */
SYS_TELL, /* Report current position in a file. */
SYS_CLOSE, /* Close a file. */
};
А вот список прототипов функций:
void halt (void) NO_RETURN;
void exit (int status) NO_RETURN;
pid_t exec (const char *file);
int wait (pid_t);
bool create (const char *file, unsigned initial_size);
bool remove (const char *file);
int open (const char *file);
int filesize (int fd);
int read (int fd, void *buffer, unsigned length);
int write (int fd, const void *buffer, unsigned length);
void seek (int fd, unsigned position);
unsigned tell (int fd);
void close (int fd);
Основной вопрос
Есть ли простой способ поместить все функции в массив или другую структуру данных в C?
Любая помощь будет наиболее ценной, это для школьного проекта, поэтому небольшой пример или ссылка были бы очень полезны, но я бы хотел создать решение самостоятельно.
Спасибо
Редактировать: Что бы я хотел делать
Я хочу иметь возможность определить некоторый массив и сохранить указатель на функции в индексах порядковых номеров перечисления.
//I don't know how to handle the type here
<some_type> system_call_arr[128];
system_call_arr[SYS_HALT] = halt;
system_call_arr[SYS_EXIT] = exit;
system_call_arr[SYS_EXEC] = exec;
// and so on....
Редактировать 2
Поскольку Бен сказал, что все аргументы будут вписываться в 32-битный аргумент, я не могу определить что-то вроде этого:
typedef int (*sys_func) (uint32_t, uint32_t, uint32_t);
sys_func syscall_array[128];
syscall_array[SYS_HALT] = (sys_func)halt;
//etc....
Это что-то вроде хорошей практики?