1

私はこの機能を持っています:

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 つのエラーが発生します。

  1. についてnum_models

    This declaration has no storage class or type specifier
    
  2. 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)
4

1 に答える 1

0

どちらのエラーstruct bs_gmm_varも未定義であることを示しています。正しいヘッダー ファイルを含めるか、コード内のその関数の前に構造を定義してください。

構造体の定義を確認するには、プリプロセッサを介してコードを実行し、出力を調べます。これにより、同じコンパイラ フラグgccgcc -E ...使用されます (リンクに使用されるフラグを除く)。

于 2013-09-04T04:33:45.397 に答える