Это объявление не имеет хранилища или спецификатора типа
У меня есть эта функция:
void bs_gmm(IMG in_img,struct bs_gmm_var *gmm_ctxt,IMG *bg_msk,IMG *bg_img)
в котором я объявляю некоторые переменные, такие как:
int num_models,num_features;
float lr,update_factor;
float deviation_thresh;
int std_dev_int;
Дело в том, что когда я пытаюсь определить или использовать эти переменные, например:
num_models=gmm_ctxt->num_models;
Я получаю две ошибки:
относительно
num_models
:This declaration has no storage class or type specifier
а также
gmm_ctxt
:gmm_ctxt is undefined
Я знаю, что локальные переменные по умолчанию являются классом автоматического хранения, а также я указал тип переменной; почему я получаю этот тип ошибки?
Вызов функции из main()
который находится в другом исходном файле.
Я знаю, что я что-то наблюдаю. Прости меня за мое невежество.
Я объявил вышеупомянутую функцию в заголовочном файле и включил ее в оба исходных файла.
Структура bs_gmm_var объявлена в заголовке, и я включил ее в оба соответствующих исходных файла. Объявление выглядит следующим образом
typedef struct bs_gmm_var
{
MEAN mean;
STD_DEV std_dev;
WEIGHT weight;
CLASSIFICATION_STATE classification_state;
RANK rank;
RANK_INDEX rank_index;
int *match_array;
float *prob_feature;
int num_models;
float lr;
float update_factor;
float deviation_thresh;
float assign_thresh,dying_thresh;
float std_dev_int;
int intialize_state;
int width;
int height;
int num_features;
int num_frames;
};
Затем я объявил указатель на указанную выше структуру в основной функции. Этот указатель вместе с другой структурой отправляется следующей функции.
Структура bs_gmm_var определяется в функции, показанной ниже:
void intialize_params(struct bs_gmm_var **gmm_ctxt,struct config_params bs_config_params)
{
struct bs_gmm_var *gmm_stats;
int width=bs_config_params.width;
int height=bs_config_params.height;
int num_features=bs_config_params.num_features;
int num_models=bs_config_params.num_models;
// Allocate memroy for whole structure
gmm_stats = (bs_gmm_var *)malloc(sizeof(bs_gmm_var));
gmm_stats->mean=(float*)calloc(num_models*num_features*width*height,sizeof(float));
.
.In this way i have allocated memory for other members(from mean to prob_feature)
.
gmm_stats->prob_feature=(float *)malloc(num_features*sizeof(float));
gmm_stats->num_models=bs_config_params.num_models;
gmm_stats->lr= bs_config_params.lr;
.In this way other members(from num_models to num_frames)are also defined
.
gmm_stats->num_frames=bs_config_params.num_frames;
*gmm_ctxt = gmm_stats;
}
Как вы можете видеть, это определяет структуру bs_gmm_var через указатель gmm_stats. Теперь указатель, который я отправил вышеупомянутой функции в качестве адреса структуры (через указатель gmm_stats), который определен. Этот указатель я отправляю в функцию:
void bs_gmm(IMG in_img,struct bs_gmm_var *gmm_ctxt,IMG *bg_msk,IMG *bg_img)
1 ответ
Обе ошибки указывают на struct bs_gmm_var
быть неопределенным. Обязательно включите правильный заголовочный файл или определите структуру перед этой функцией в коде.
Чтобы подтвердить определение структуры, может помочь запуск кода через препроцессор и просмотр выходных данных. С gcc
это gcc -E ...
используя те же флаги компилятора (кроме тех, которые используются для компоновки).