Я реализую Strassen's matrix multiplication algorithm как часть задания. Я правильно закодировал его, но я не знаю, почему он дает ошибку сегментации. Я назвал strassen() как strassen (0, n, 0, n); в основном. n - это число, заданное пользователем, которое равно двум, и это максимальный размер матрицы (2D-массив). Он не дает segfault для n = 4, но для n = 8,16,32 он дает segfaults. Код приведен ниже.Ошибка сегментации в рекурсивной функции
void strassen(int p, int q, int r, int s)
{
int p1,p2,p3,p4,p5,p6,p7;
if(((q-p) == 2)&&((s-r) == 2))
{
p1 = ((a[p][r] + a[p+1][r+1])*(b[p][r] + b[p+1][r+1]));
p2 = ((a[p+1][r] + a[p+1][r+1])*b[p][r]);
p3 = (a[p][r]*(b[p][r+1] - b[p+1][r+1]));
p4 = (a[p+1][r+1]*(b[p+1][r] - b[p][r]));
p5 = ((a[p][r] + a[p][r+1])*b[p+1][r+1]);
p6 = ((a[p+1][r] - a[p][r])*(b[p][r] +b[p][r+1]));
p7 = ((a[p][r+1] - a[p+1][r+1])*(b[p+1][r] + b[p+1][r+1]));
c[p][r] = p1 + p4 - p5 + p7;
c[p][r+1] = p3 + p5;
c[p+1][r] = p2 + p4;
c[p+1][r+1] = p1 + p3 - p2 + p6;
}
else
{
strassen(p, q/2, r, s/2);
strassen(p, q/2, s/2, s);
strassen(q/2, q, r, s/2);
strassen(q/2, q, s/2, s);
}
}
Скорее всего, условие завершения не корректно, и функция рекурсирует, пока не переполнит стек. Вы должны хотя бы проверить, что происходит при работе в отладчике. Если отладчик останавливается в одном из присваиваний массиву 'c', проверьте индексы, чтобы они не были за пределами границ. –
Не оставляйте нас догадки. В чем причина segfault, переполнение стека или переполнение границ массива? Удалите его в gdb и предоставите дополнительную информацию. –
Вы также можете попробовать и поместить объявления 'int' внутри первого' if'. Хотя я думаю, что Йоахим прав. Вы уверены, что условия '==', а не '<='? Скажем, 'p' и' q' равны 10 и 10. Тогда мы имеем (10,10) (10,5) (10,2) (10,1) (10,0) ... –