в C каждый обратный вызов должен получить параметр void*
, чтобы разрешить такое разделение. Затем вы можете передать адрес структуры, содержащей нужные вам параметры:
struct foo_data {
int alpha;
int beta;
};
int foo(int* X, int X_size, void *data_) {
struct foo_data *data = data_;
ret = 0;
for(int k = 0; k < X_size; k++) {
ret = ret + X[k]*X[k]*data->alpha + data->beta;
}
return ret;
}
void walk(
int* X, int X_size, float step_size,
int (*function)(/*function variables*/, void *function_data),
void *function_data
) {
// some instructions
}
int main() {
struct foo_data foo_data;
foo_data.alpha = 1234;
foo_data.beta = 5678;
walk(X, X_size, step_size, foo, &foo_data);
}
Это может быть довольно громоздко, но это лучший способ сделать это в C.
Кроме того, вы можете сделать их глобальными. Это не вопрос «безопасности», а скорее вопрос гибкости. Если вам в конечном итоге понадобится более одной альфы и беты, особенно если они нужны вам одновременно, вы будете разочарованы, если сделаете их глобальными переменными сейчас. Если вы знаете, что не будете, тогда все может быть в порядке. Чем больше и сложнее ваша программа, тем хуже использование глобальных переменных.
Прикрепляю к посту несколько видео по теме: