我试图通过引用将矩阵传递给函数。该函数将用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
传递给函数process(&a, 3,4);
。
II。或者,可以使用以下功能:
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);
III。最后,我们可以使用以下方法:
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);
一样调用它。通过这种方式,我们可以在2D中获得对矩阵元素的访问。
答案 0 :(得分:7)
由于您已经在提供内存,因此不需要三重指针。如果你要在de function中分配内存,你可以使用它。
如果不提供至少1维的大小,则无法索引2维矩阵。原因是编译器需要生成代码以考虑两个维度来访问正确的偏移量。在这种特殊情况下,我建议将一个简单的指针和索引作为一维数组传递,如下所示:
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 * nCols + j] *= -1;
}
}
}
然后你可以这样称呼它:
process((float*)a,3,4);
这样您可以手动索引缓冲区。
答案 1 :(得分:3)
您必须将函数的签名更改为:
void process(float (*matrix)[3][4], int nRows, int nCols){
调用该函数时,请使用:
process(&a, 3, 4);
答案 2 :(得分:1)
如果将nCols
参数放在matrix
参数之前,则可以传递二维矩阵并以自然方式使用它,而无需额外的*
运算符或索引算法:
void process(int nRows, int nCols, float (*matrix)[nCols])
{
for (short i = 0 ; i < nRows; i++)
{
for (short j = 0; j < nCols; j++)
{
matrix[i][j] *= -1;
}
}
}
然后你这样打电话给process
:
process(3, 4, matrix);
顺便提及:
i
和j
short
,否则您应该声明int
。 int
被定义为目标平台上整数的“自然”大小。答案 3 :(得分:0)
如果你有一个矩阵那么容易:
int m[2][2]={{1,0},{0,1}};
并且您想要定义指向m的指针,因此您必须声明:
int (*mptr)[2][2];
mprt=m; // or mptr=&m; is the same.
你可以用它来指向矩阵m的元素。
(*mptr)[i][j]....