2016-12-25 52 views
0

我无法理解发生了什么。我创建了下面这个帖子矩阵:Function to dynamically allocate matrix打印具有分离功能的动态二维矩阵

要打印的矩阵,我创造了这个功能:

void PrintMatrix(uint8_t *matrix, size_t nrows, size_t ncols) 
{ 

    // Prints matrix 

    size_t i, j; 

    printf("\n"); 

    for (i = 0; i < nrows; ++i) 
    { 
      for (j = 0; j < ncols ; ++j) 
      { 
      printf("%" PRIu8 "\t", matrix[i][j]); 
      } 

    printf("\n"); 
    } 

    printf("\n"); 
} 

此功能会导致编译错误:

error: subscripted value is neither array nor pointer nor vector 
     printf("%" PRIu8 "\t", matrix[i][j]); 

为了检查函数,我复制main()内的代码并运行它,令人惊讶的没有任何问题,所以,为什么它作为一个分离的函数运行时不起作用?

+0

。在你的代码没有2D阵列(又名矩阵)。而C不支持_vectors_。这是C++吗? – Olaf

+0

@Olaf。这是一个用malloc动态分配的2D矩阵(我不知道这是否被称为2D矩阵)。是的,这是C. –

+0

1)C没有“矩阵”。 2)矩阵总是二维的。 3)矩阵的C等价物是二维数组。 4)你的代码不包含2D数组,而是一个1D数组(指向第一个元素的指针)。你如何分配数组不会改变使用的类型。你可以很好地用'malloc'分配任意大小的二维数组。但是你需要正确的类型。指向指针的指针是一个非常不同的数据结构。 5)不遵循以下语言规则不会影响它。 C不是非常类型安全的,但仍有一些规则需要遵循。 6)如果你想要一个矩阵,使用一个二维数组。 – Olaf

回答

1

matrix的类型是uint8_t *。如果将数组传递给函数调用(它将转换为指向数组的指针),它应该是uint8_t (*)[ncols]类型。

变化

void PrintMatrix(uint8_t *matrix, size_t nrows, size_t ncols) 

void PrintMatrix(size_t nrows, size_t ncols, unit8_t (*matrix)[ncols]) 
+0

如果是这样,函数调用应该是'PrintMatrix(nrows,ncols,matrix)'对吗? –

+0

是的。这就是它应该被调用的方式。 – haccks

+0

注意:为了便于记录,最好对二维数组使用等效(!)'uint8_t matrix [nrows] [ncols]'(即将数组声明为变量)。 – Olaf