Я пытаюсь собрать библиотеку 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;
Вы должны избегать объявления указателей, не давая им значения. Следовательно, вы должны заменить декларацию на
CvTrack *track=NULL; (if you use C++ without the latest version) or
CvTrack *track=nullptr; (with C++11)
При этом вы уверены, что всегда будете указывать значение указателю (даже если он равен NULL). Затем вы должны проверить перед назначением чего-либо, если указатель равен NULL, чтобы избежать ошибки во время выполнения.
Если tt
список пуст, или если он не содержит элемент с требуемой областью, то track
никогда не будет инициализирован. Это то, на что жалуется компилятор.
Функция, вероятно, должна пытаться обновить стойку, только если она действительно была найдена в списке дорожек.
Ситуация для blob
вероятно похоже.