我有以下两个功能:
double** transpose(double **a, int r, int c){
static double trans[100][100];
int i,j;
for(i = 0; i < r; i++)
for(j = 0; j < c; j++)
trans[j][i] = a[i][j];
return trans;
}
double(*matrixMultiply(double a[10][10], double b[10][10],
int rowA, int colB, int colARowB))[10]{
static double c[10][10];
int i, j, k;
for(i = 0; i < rowA; i++)
for(j = 0; j < colB; j++){
c[i][j] = 0;
for(k = 0; k < colARowB; k++)
c[i][j] += a[i][k]*b[k][j];
}
return (double*) c;
}
虽然我理解算法,但有人可以解释一下这两个函数返回的内容(类型,指针......)吗?第二个似乎返回一个数组,但我认为C中的函数不能返回数组...
真的对这些指针感到困惑......
为什么数组(trans
和c
)声明为静态?据我所知,当你用静态声明一个变量或一个函数时,它不能被导入以便在另一个文件中使用,但这在某种情况下并非如此......
答案 0 :(得分:3)
两个函数都试图返回指向数组的指针。两者都做错了并且无法在我的系统上编译。
除非它是sizeof
或一元&
运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,表达式为类型&#34; T
&#34;的N元素数组;将被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向T
&#34;的指针,并且表达式的值将是第一个元素的地址。阵列。
在transpose
函数中,我们返回表达式 trans
。 trans
类型为&#34;包含T
&#34;的100个元素数组,其中T
为&#34; 100个元素数组double
&#34 ;。它不是sizeof
或一元&
运算符的操作数,因此它被转换(&#34;衰减&#34;)到类型为&#34的表达式;指向{的指针{1}}&#34;,在这种情况下是&#34;指向T
&#34;的100个元素数组的指针(double
), NOT &#34;指针指向double (*)[100]
&#34;,(double
)的指针。
编译器应该抱怨该函数。我的确如此:
double **
在gcc -c -std=c99 -pedantic-errors -Wall transpose.c
transpose.c: In function âtransposeâ:
transpose.c:7: error: return from incompatible pointer type
函数中,matrixMultiply
具有类型&#34; 10个元素的10个元素数组c
&#34;,其中&#34;衰变&# 34; to&#34;指向double
&#34;的10元素数组; (double
)。第二个函数具有正确的返回类型 - double (*)[10]
- 然后通过将double (*)[10]
投射到c
来 MESS IT UP return语句,我们得到与以前相同的错误:
double *
他们应刚写完
gcc -c -std=c99 -pedantic-errors -Wall matrixMultiply.c
matrixMultiply.c: In function âmatrixMultiplyâ:
matrixMultiply.c:11: error: return from incompatible pointer type
一切都会好起来的。
读取第二个函数定义的方法如下:
return c;
请注意,任何一个函数都有希望工作的唯一原因(一旦类型问题被理顺), matrixMultiply -- matrixMultiply
matrixMultiply( ) -- is a function taking
matrixMultiply( /* some params */ ) -- some parameters (omitted for brevity)
*matrixMultiply( /* some params */ ) -- returning a pointer
(*matrixMultiply( /* some params */ ))[10] -- to a 10-element array
double(*matrixMultiply( /* some params */ ))[10] -- of double
和trans
都被声明为c
,这意味着它们的生命周期延伸到整个程序,而不仅仅是它们各自功能的生命周期。如果没有static
关键字,它们将在其封闭函数返回后停止存在,并且这些指针将变为无效。
这不一定是好的做法 - 这些功能不再是可重入的,也不是线程安全的。将目标数组作为参数传递给函数会更好,但要注意,指向10元素数组的指针与指向11元素数组的指针是不同的不兼容类型 - 如果必须处理数组使用不同数量的列,这可能会变得棘手。 VLA可以帮助解决这个问题:
static
假设您有可用的VLA(您应该在C99和C2011系统上,尽管它们已在C2011中成为可选项)。如果你不......那就变得更难了。