Заполнить массив указателей функций во внешних файлах (C) - PullRequest
0 голосов
/ 03 июля 2018

Я уже давно борюсь с указателями на функции. Может быть, вы, ребята, можете мне помочь.

В моем проекте у меня есть несколько функций для одного устройства, и каждая функция записана в своем собственном файле .c. Общие функциональные возможности (которые применяются ко всем функциям устройства) записаны в generic.c.

Я хотел бы создать массив указателей на функции в общем файле c и заполнить этот массив в других файлах функций. Поэтому я могу вызвать нужную функцию на основе идентификатора функции устройства в универсальном файле.

Что у меня сейчас есть:

// in generic.h:
typedef void (*func_ptr_t[])(arguments);
extern func_ptr_t devFunctions[3];

И я бы хотел:

// in function1.c:
#include "generic.h"

devFunctions[1] = &functionName;

Но затем он жалуется на отсутствие спецификатора типа И Инициализатор массива должен быть списком. Если я добавлю тип как

func_ptr_t devFunctions[1] = &functionName;

Я получаю ошибку о неполном типе элемента 'func_ptr_t'.

Я не могу инициализировать весь список массивов из одного файла, поскольку он заполнен из нескольких файлов.

У кого-нибудь есть идеи, как с этим бороться?

Спасибо!

-edit-

Поскольку вы не можете использовать операторы вне функций, я изменил свое приложение. Теперь он больше не использует массив и обновляет указатель функции в generic.c при вызове определенного файла функции.

Итак, конечный результат:

В generic.h:

typedef void (*func_ptr_t)(<function arguments>)

В generic.c:

func_ptr_t devFunction;

В function1.c:

#include "generic.h"
extern func_ptr_t devFunction;

void functionToBeCalledFromMain( void ){
    devFunction = functionName;
}

void functionName (void ){
    // Function to be called from generic.c via function pointer
}

Ответы [ 3 ]

0 голосов
/ 03 июля 2018

Например, о функциях типа int f(int); вы можете проверить:

/* function definition */
int functionName(int arg)
{
    /* do things */
    return arg * 2;
}

/* create the type "function pointer int->int" */
typedef int (*func_ptr_t)(int);

/* create the array */
func_ptr_t devFunctions[3];

int main(void)
{   
    /* associate the good function */
    devFunctions[0] = &functionName;

    /* call it with an arg */
    return devFunctions[0](42);
}
0 голосов
/ 03 июля 2018

Как указывало большинство из вас, заполнение массива - это оператор, который нельзя поместить вне функции (дух ...). Так что то, что я хотел, на самом деле не сработает. Я переписываю свое приложение, чтобы обновлять указатель на функцию (больше не массив) при каждом запуске нужной мне функцией. Экономит много хлопот :)

Спасибо, ребята!

0 голосов
/ 03 июля 2018

Сложив вышеприведенные комментарии, вы, вероятно, хотели

typedef void (*func_ptr_t)(arg_type_list);
...