我有这个函数:
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
我知道本地变量默认情况下是auto存储类,而且我已经指定了变量的类型;为什么会出现这种类型的错误?
函数调用来自另一个源文件中的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;
}
正如您所看到的,这通过指针gmm_stats定义了结构bs_gmm_var。现在,我发送给上面函数的指针是定义的结构的地址(通过指针gmm_stats)。我将指针发送到函数:
void bs_gmm(IMG in_img,struct bs_gmm_var *gmm_ctxt,IMG *bg_msk,IMG *bg_img)
这两个错误都指向struct bs_gmm_var
未定义。请确保包含正确的头文件,或者在代码中定义该函数之前的结构。
为了确认结构的定义,通过预处理器运行代码并查看输出可能会有所帮助。对于gcc
,它是使用相同编译器标志(用于链接的标志除外)的gcc -E ...
。