私はこの機能を持っています:
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;
次の 2 つのエラーが発生します。
について
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;
}
ご覧のとおり、これはポインター 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)