GDB арифметическое исключение — без деления на ноль — ошибка времени выполнения

Чтобы получить среднее значение карты диспаратности, мне пришлось написать собственный метод, чтобы игнорировать отрицательные значения диспаратности:

float Utility::calcMeanDisparity(cv::Mat const& matrix)
{
int total = 0;
int numElements = 0;
for(int r = 0; r < matrix.rows; ++r)
{
for(int c = 0; c < matrix.cols; ++c)
{
if(static_cast<float>(matrix.at<short>(r,c)) > 0)
{
total += static_cast<float>(matrix.at<short>(r,c));
++numElements;
}
}
}
float mean = total / abs(numElements);
std::cout << total << " / " << numElements << " = " << mean << std::endl;
return mean;
}

но мой код просто падает через определенное время с ошибкой GDB:

Program received signal SIGFPE, Arithmetic exception.
0x000000000044a992 in Utility::calcMeanDisparity (matrix=...) at src/utility.cpp:250
250   float mean = total / abs(numElements);

Но нет никакого способа, которым я делаю деление на ноль. Вот три последние строки, которые мой код пытается вычислить:

950149 / 4275 = 222
804412 / 4429 = 181
873770 / 4253 = 205

Я также добавил abs(foo) материал, чтобы быть полностью безопасным деления на ноль.

На самом деле я понятия не имею, что делать в данный момент.

Может, у кого-то из вас есть идея для этого.

0

Решение

Если matrix.rows а также matrix.cols 0, numElements будет 0, и вы получите деление на 0.

Поскольку вы, кажется, знаете, как использовать отладчик, изучите значения matrix.rows а также matrix.cols проверить причину.

0

Другие решения

Спасибо всем за помощь, но проблема оказалась проще, чем ожидалось.

Время от времени карта диспаратности содержала области с нулевыми / отрицательными значениями. поэтому вся подматрица, которую я передал в функцию, имела среднее значение 0, поэтому условие if было проигнорировано. Итак, финальный дивизион был 0 / 0 -> арифметическое исключение.

0

По вопросам рекламы [email protected]