Это объявление не имеет спецификатора хранилища или типа.

У меня есть эта функция:

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;

Я получаю две ошибки:

  1. Относительно num_models:

    This declaration has no storage class or type specifier
    
  2. и 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;
}

Как видите, это определяет структуру 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)

person praveen dasari    schedule 04.09.2013    source источник
comment
Вторая ошибка указывает на то, что структура gmmctxt не определена. Из-за этого возникает первая ошибка - поскольку он не определен, член num_models не имеет хранилища или типа. Можете ли вы опубликовать определение типа gmmctxt и убедиться, что его заголовок включен?   -  person Manoj Awasthi    schedule 04.09.2013
comment
@praveen можешь показать struct bs_gmm_var ??   -  person Jeyaram    schedule 04.09.2013
comment
Я видел это предупреждение, когда делал codegolf. Эта программа вызовет его: a; main(){return 0;} поскольку переменная a объявляется с использованием поведения implicit int. Я думаю, нам понадобится SSCCE, чтобы найти, где вы пропустили декларацию.   -  person luser droog    schedule 04.09.2013
comment
Поскольку вы определяете параметр gmm_ctxt, вполне вероятно, что gmmctxt является простой опечаткой вместо gmm_ctxt (или наоборот). Также кажется, что у вас есть проблемы с правописанием «обновление» (это не пишется «updtae»). Другая проблема не имеет смысла, учитывая код, который вы показываете (int num_models, похоже, включает спецификатор типа), поэтому проблема, вероятно, заключается в коде, который вы не показываете.   -  person Jonathan Leffler    schedule 04.09.2013
comment
Покажите нам полное определение функции, а не отдельные его части. Если возможно, удалите все, что вы можете, все еще демонстрируя ошибки. Не пытайтесь угадать, что, по вашему мнению, нам нужно увидеть; если бы вы это знали, вы бы уже сами решили эту проблему.   -  person Keith Thompson    schedule 04.09.2013
comment
О: Я только что заметил, что есть num_models как член структуры, на которую указывает gmmctxt; у вас могут возникнуть проблемы с классом хранения, если gmmctxt не определено (а не gmm_ctxt). Это не то сообщение, которое я ожидал, но если компилятор сбит с толку предшествующей ошибкой, он может объяснить нечетную вторую ошибку.   -  person Jonathan Leffler    schedule 04.09.2013
comment
@ManojAwasthi Я думаю, что проблема с num_models не связана с gmm_ctxt, потому что некоторые другие переменные (в той же функции) также дают ту же ошибку.   -  person praveen dasari    schedule 04.09.2013
comment
@Jeyaram, я отредактировал его. Пожалуйста, взгляните на него.   -  person praveen dasari    schedule 04.09.2013
comment
@JonathanLeffler Я думал так же (относительно num_models), но некоторые другие переменные также дают ту же ошибку. Кстати извините за опечатки.   -  person praveen dasari    schedule 04.09.2013
comment
@KeithThompson я отредактировал. Пожалуйста, взгляните на это.   -  person praveen dasari    schedule 04.09.2013
comment
Я вижу новую информацию. Чего я не вижу, так это того, что мы просили, а именно кода, начиная с void bs_gmm(...){ и далее до строки, содержащей ошибку компилятора. Строка(и) с ошибкой(ами) компилятора должна быть четко помечена; точные ошибки были бы полезны. Мы предполагаем, что нет других ошибок, предшествующих тем, о которых вы беспокоитесь — если есть какие-то другие ошибки, исправьте их в первую очередь. Определение структуры полезно; функция инициализации не имеет большого отношения к тому, почему bs_gmm() не компилируется, но была бы очень уместна, если бы были проблемы во время выполнения.   -  person Jonathan Leffler    schedule 04.09.2013


Ответы (1)


Обе ошибки указывают на то, что struct bs_gmm_var не определено. Обязательно включите правильный заголовочный файл или определите структуру перед этой функцией в коде.

Чтобы подтвердить определение структуры, может помочь запуск кода через препроцессор и просмотр вывода. С gcc это gcc -E ... с использованием тех же флагов компилятора (кроме тех, которые используются для компоновки).

person ash    schedule 04.09.2013
comment
Я включил заголовки. Я отредактировал код, чтобы посмотреть на него. - person praveen dasari; 04.09.2013
comment
хм, это выглядит хорошо. Я рекомендую предварительную обработку, как я добавил к ответу, и просмотрите это, чтобы точно увидеть, что получает компилятор. Убедитесь, что определение структуры находится выше строки, в которой возникает ошибка. Также обратите внимание, что могут помочь полные сообщения об ошибках. - person ash; 04.09.2013