#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. Следует отметить, однако, что в некоторых ситуациях существует предпосылка, известная разработчику, но не компилятору, например. в этом случае может быть, что список не пуст и содержит требуемый элемент (вероятно, это не лучший дизайн, но это другая тема).