我正在实现Strassen's matrix multiplication algorithm作为赋值的一部分。我已经正确编码了,但我不知道它为什么给出分段错误。 我叫strassen()为strassen(0,n,0,n);主要是。 n是由用户给出的数字,它是2的幂,它是矩阵(2D阵列)的最大尺寸。 它没有给n = 4的段错误,但是对于n = 8,16,32,它给出段错误。代码如下所示。递归函数中的分段错误
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'数组的任何一个赋值处,请检查这些索引以使它们不超出范围。 – 2013-03-16 16:22:06
不要让我们猜测。段错误的原因是什么,堆栈溢出或溢出数组边界?在gdb中敲击它并提供更多信息。 – 2013-03-16 16:24:03
您也可以尝试将'int'声明放在第一个if中。虽然我觉得约阿希姆是正确的。你确定条件是'=='而不是'<='?说'p'和'q'是10和10.然后我们有(10,10)(10,5)(10,2)(10,1)(10,0)... – 2013-03-16 16:25:55