【发布时间】:2013-01-05 04:27:15
【问题描述】:
我正在尝试通过引用将矩阵传递给函数。该函数会将矩阵的每个元素A[i][j] 替换为-A[i][j]。我首先创建矩阵:
float a[3][4] =
{
{1.0f, 0.0f, 0.0f, 0.0f},
{0.0f, 1.0f, 0.0f, 0.0f},
{1.0f, 1.0f, 0.0f, 0.0f},
};
然后,我得到指向这个矩阵的指针:
float*** pa = &a;
那么,我介绍如下函数:
void process(float ***matrix, int nRows, int nCols){
short i;
short j;
for (i=0 ; i<nRows; i++){
for (j=0 ; j<nCols ; j++){
(*matrix)[i][j] *= -1;
}
}
}
我称之为:
process(pa,3,4);
我的程序执行失败并返回:
Segmentation fault: 11
有什么想法吗?
答案摘要:根据本问题收到的问题的一些注释:
我。可以使用上述函数,前提是a 的初始化稍有不同,以便成为float**。特别是:
int numberOfRows = 3;
int numberOfColumns = 4;
float **a = (float **) malloc(sizeof (float *) * numberOfRows);
for (i = 0; i < numberOfRows; ++i) {
a[i] = (float *) malloc(sizeof (float) * numberOfColumns);
}
然后,它作为process(&a, 3,4); 传递给函数process。
二。或者,可以使用以下功能:
void multi_by_minus(float *matrix, int nRows, int nCols) {
short i,j;
for (i = 0; i < nRows; i++) {
for (j = 0; j < nCols; j++) {
matrix[i * nCols + j] *= -1;
}
}
}
将矩阵视为一维数组。在这种情况下,我们只需将其调用为 multi_by_minus(&a, 3, 4);
三。最后,我们可以使用方法:
void process2(int nRows, int nCols, float (*matrix)[nCols]) {
short i, j;
for (i = 0; i < nRows; i++) {
for (j = 0; j < nCols; j++) {
matrix[i][j] *= -1;
}
}
}
我们提供了一个指向a的指针,也就是说,我们像process2(3,4,&a);一样调用它。通过这种方式,我们获得了对二维矩阵元素的访问权限。
【问题讨论】:
-
stackoverflow.com/questions/16004668/… 在上面你会发现一个程序,我用任何可能的方式为 C (gcc C11/C99) 分配和操作矩阵的函数。