传递矩阵的COLUMN以起作用

时间:2018-03-04 13:47:51

标签: c parameter-passing

我有一个关于将矩阵的单个列传递给函数的问题。我只需要操作整个矩阵的一列,但我似乎不知道如何做到这一点。我在网上寻找答案,但似乎没有人有这个问题。谢谢您的想法!

1 个答案:

答案 0 :(得分:0)

如果您只需要偶尔处理来自一列的数据,那么只需传递整个矩阵,并在需要时简单地处理单列数据。如果经常需要处理单列数据,那么您必须有一个实用程序函数来提取单列数据,因为在C中,任何数组(包括数组)数组)只是一块内存。 C没有任何行和列的概念;你必须为自己做这件事。

与大多数这样的实用程序函数一样,有许多方法可以实现目标,实际实现更多地取决于您需要如何使用结果而不是获取结果的任何特定方式。一种方式是这样的:

#include <stdlib.h>
#include <stdio.h>

#define NUM_COLS 3
#define ERR_OUT_OF_RANGE 1
#define ERR_NOMEM -1

int get_matrix_column(int (*matrix)[NUM_COLS], int nRows, int iCol, int **result) {
  if (iCol < 0 || iCol >= NUM_COLS) return ERR_OUT_OF_RANGE;

  *result = malloc(sizeof(int) * nRows);
  if (*result == NULL) return ERR_NOMEM;

  for (int i = 0; i < nRows; i++) {
    (*result)[i] = matrix[i][iCol];
  }
  return 0;
}

int main(void) {
  int matrix[4][3] = { {2, 3, 4}, {7, 8, 9}, {0, 1, 2}, {5, 6, 7} };
  int *col = NULL;
  int rc = get_matrix_column(matrix, 4, 1, &col);
  if (rc)
    puts("Error getting column");
  else
    for (int i = 0; i < 4; ++i) {
      printf("%d ", col[i]);
    }
  free(col);
  return 0;
}

此版本处理在自动存储(堆栈中的AKA)中使用显式边界定义的矩阵。当传递给函数时,这种数组的指针衰减导致与单个元素数组略有不同的签名。使用NUM_COLS宏常量,因为此类声明中的最终维度必须是常量。

同样,这只是许多方法中的一种方式。重点是,如果你只想要一个列的值,你必须自己去获取它们,因为C完全不知道你在说什么。