3

我正在尝试通过引用将矩阵传递给函数。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

有任何想法吗?

答案摘要:基于此问题收到的问题的一些注释:

I. 可以使用上述函数,前提是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);

二、或者,可以使用以下功能:

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);。通过这种方式,我们获得了对二维矩阵元素的访问权限。

4

4 回答 4

9

由于您已经在提供内存,因此不需要三重指针。如果要在 de 函数内分配内存,您将使用它。

如果不提供至少 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);

这样您就可以手动索引缓冲区。

于 2013-01-22T01:31:02.447 回答
3

您必须将函数的签名更改为:

void process(float (*matrix)[3][4], int nRows, int nCols){

调用该函数时,请使用以下命令:

process(&a, 3, 4);
于 2013-01-22T01:39:09.510 回答
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);

顺便:

  • 除非有特殊原因,否则ij short申报intint被定义为目标平台上整数的“自然”大小。
于 2013-01-22T01:57:22.563 回答
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]....
于 2017-01-18T03:13:24.733 回答