Ошибка C : идентификатор IntilliSense «track» не определен — «потенциально неинициализированная переменная локального указателя «track»»

#c #visual-studio #opencv #visual-studio-2013 #cvblobslib

#c #visual-studio #opencv #visual-studio-2013 #cvblobslib

Вопрос:

Я пытаюсь создать библиотеку cvblob с использованием OpenCV и при компиляции в VS 2013,

     error C4703: potentially uninitialized local pointer variable 'track' used
    error C4703: potentially uninitialized local pointer variable 'blob' used
  

Я не уверен, почему это так, поскольку переменные указателя определены блоком выше (хотя и в отдельном цикле). Вот код:

   // Update track
  //cout << "Matching: track=" << track->id << ", blob=" << blob->label << endl;
  track->label = blob->label; // ERROR HERE
  track->centroid = blob->centroid;
  

Я использую предварительно написанные заголовочные и исходные файлы, поэтому я не уверен, в чем проблема. Кто-нибудь знает, в чем заключается исправление?

Ранее //Update Track здесь, где «track» и «blob» упоминаются выше, без ошибок:

   // Select track
  CvTrack *track;
  unsigned int area = 0;
  for (list<CvTrack*>::const_iterator it=tt.begin(); it!=tt.end();   it)
  {
    CvTrack *t = *it;

    unsigned int a = (t->maxx-t->minx)*(t->maxy-t->miny);
    if (a>area)
    {
      area = a;
      track = t;
    }
  }

  // Select blob
  CvBlob *blob;
  area = 0; 
  

Комментарии:

1. компилятор компилирует информацию о том, что большой двоичный объект не инициализируется. если это правда, доступ к blob-> label или blob-> centroid приведет к segfault. вам не хватает какого-либо кода, инициализирующего blob и track?

2. @berak Я бы не подумал, что будет отсутствовать код, поскольку они разработаны, коды выпуска для cvBlob . Я добавил некоторый код к своему исходному сообщению выше, где указаны ссылки на «track» и «blob».

3. в приведенном выше примере track будет инициализирован только в том случае, если он найдет достаточно большую область. (и опять же, вам, вероятно, следует избегать устаревшего c-api (и cvBlobsLib) в целом, они перешли на c уже в 2010 году)

Ответ №1:

Вам следует избегать объявления указателей без указания им значения. Следовательно, вы должны заменить объявление на

 CvTrack *track=NULL; (if you use C   without the latest version) or
CvTrack *track=nullptr; (with C  11)
  

При этом вы уверены, что всегда будете присваивать значение своему указателю (даже если оно равно NULL). Затем вы должны проверить, прежде чем назначать что-либо, если указатель равен нулю, чтобы избежать ошибки во время выполнения.

Комментарии:

1. Это фактически решило проблему как для большого двоичного объекта, так и для дорожки. После нескольких часов разочарований программа работает отлично.

Ответ №2:

Если tt список пуст или не содержит элемента с требуемой областью, он track никогда не будет инициализирован. Это то, на что жалуется компилятор.

Функция, вероятно, должна пытаться обновить стойку, только если она действительно была найдена в списке дорожек.

Ситуация blob , вероятно, аналогична.

Комментарии:

1. Следует отметить, однако, что в некоторых ситуациях существует предпосылка, известная разработчику, но не компилятору, например. в этом случае может быть, что список не пуст и содержит требуемый элемент (вероятно, это не лучший дизайн, но это другая тема).