Безопасно ли делать обучающие данные и метки глобальными переменными в C?

Безопасно ли делать обучающие данные и метки глобальными переменными в C?
Безопасно ли делать обучающие данные и метки глобальными переменными в C? - jochycampusano @ Unsplash

в 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.

Кроме того, вы можете сделать их глобальными. Это не вопрос «безопасности», а скорее вопрос гибкости. Если вам в конечном итоге понадобится более одной альфы и беты, особенно если они нужны вам одновременно, вы будете разочарованы, если сделаете их глобальными переменными сейчас. Если вы знаете, что не будете, тогда все может быть в порядке. Чем больше и сложнее ваша программа, тем хуже использование глобальных переменных.

Прикрепляю к посту несколько видео по теме:

Прикрепленное видео 1 - Лекция 4. Логистическая регрессия. Открытый курс OpenDataScience по машинному обучению mlcourse.ai

Прикрепленное видео 2 - Учим python за 7 часов! Уроки Python Полный курс обучения программированию на python с нуля

Прикрепленное видео 3 - Обучение FlutterFlow, с нуля до про. Часть 1 из 2


LetsCodeIt, 26 марта 2023 г., 18:09