创建尺寸可变的矩阵

时间:2019-02-10 16:48:46

标签: c

我正在尝试使用一个函数创建变量矩阵,该函数输入一个空数组指针m并输出矩阵中具有值m元素的int数组指针1,2,3,4,...n。我使用变量k并向上增加该值来完成此操作(不确定这是否是最佳方法)。

我在subscripted value is not an array, pointer, or vector的for循环中得到一个matrix[i][j] = k++;,但我不确定为什么它只出现在for循环中而没有其他地方。

如果我输入一个称为矩阵的int数组指针,我不应该得到这个错误吗?

int *create_matrix(int* matrix) {
    int i,j;
    int k = 0;

    // 'total' will be 70 = 10 * 7
    int total = sizeof(matrix);

    // 'column' will be 7 = size of first row
    int column = sizeof(matrix[0]);

    // 'row' will be 10 = 70 / 7
    int row = total / column;


    for (i=0; i < row; i++) {
        for (j=0; j < column; j++) {
            matrix[i][j] = k++;
        }
    }
    return matrix;
}

int main(void) {

    // Creating a custom matrix.
    int m[3][4] = {0};
    create_matrix(*m);
    return 0;
}

3 个答案:

答案 0 :(得分:1)

您需要了解数组和指针之间的区别。您可以将指针指向矩阵,但是只要您仅通过指针访问数组,有关大小和维数的信息就会丢失。

您需要执行以下操作:

int *create_matrix(int* matrix, size_t size_x, size_t size_y) {
   ...
}

int main()
{
    int m[3][6];
    size_t size_y=sizeof m[0]/sizeof m[0][0];
    size_t size_x=sizeof m / sizeof m[0];
    create_matrix(m);
}

答案 1 :(得分:1)

要做

int m[3][4] = {0};
create_matrix(*m);

等同于

int m[3][4] = {0};
create_matrix(m[0]);

所以等价于

int m[4] = {0};
create_matrix(m);

// 'total' will be 70 = 10 * 7
int total = sizeof(matrix);

矩阵int *,如果地址使用32b,则sizeof(matrix)的值为4,如果地址使用64b,则// 'column' will be 7 = size of first row int column = sizeof(matrix[0]); 的值为8

矩阵的有效大小无关紧要


matrix[0]

matrix[i][j] = k++; 是一个 int ,因此您可以得到一个 int 的大小(可能是4或8)


matrix[i][j]

因为矩阵 int * 形式,#include <stdio.h> void fill_matrix(int matrix[][4], size_t row) { size_t i, j; int k = 0; for (i=0; i < row; i++) { for (j=0; j < sizeof(matrix[0])/sizeof(int); j++) { matrix[i][j] = k++; } } } int main(void) { // Creating a custom matrix. int m[3][4] = {0}; fill_matrix(m, sizeof(m)/sizeof(m[0])); size_t i, j; for (i=0; i < sizeof(m)/sizeof(m[0]); i++) { for (j=0; j < sizeof(m[0])/sizeof(int); j++) { printf("matrix[%d][%d] = %d\n", i, j, m[i][j]); } } return 0; } 无效。

将其命名为矩阵并没有帮助。


您的程序可以是:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra m.c
pi@raspberrypi:/tmp $ ./a.out
matrix[0][0] = 0
matrix[0][1] = 1
matrix[0][2] = 2
matrix[0][3] = 3
matrix[1][0] = 4
matrix[1][1] = 5
matrix[1][2] = 6
matrix[1][3] = 7
matrix[2][0] = 8
matrix[2][1] = 9
matrix[2][2] = 10
matrix[2][3] = 11

编译和执行:

i*10+j

如果您使用k++而不是matrix[0][0] = 0 matrix[0][1] = 1 matrix[0][2] = 2 matrix[0][3] = 3 matrix[1][0] = 10 matrix[1][1] = 11 matrix[1][2] = 12 matrix[1][3] = 13 matrix[2][0] = 20 matrix[2][1] = 21 matrix[2][2] = 22 matrix[2][3] = 23 初始化矩阵的每个单元格,那么在打印时可能更容易看到:

{{1}}

答案 2 :(得分:0)

您的尝试是合理的尝试,但它揭示了一些有关C对象如何工作的误解。没关系。您的例子是一个很好的教学例子,我相信您会为自己的成功感到高兴。现在尝试这个:

static const int NO_ROWS    = 3;
static const int NO_COLUMNS = 4;

int *create_matrix(
  int *const matrix, const int no_rows, const int no_columns
) {
    int k = 0;
    for (int i = 0; i < no_rows; i++) {
        for (int j = 0; j < no_columns; j++) {
            matrix[no_columns*i+j] = k++;
        }
    }
    return matrix;
}

int main(void) {
    // Creating a custom matrix.
    int m[NO_ROWS][NO_COLUMNS];
    create_matrix(m[0], NO_ROWS, NO_COLUMNS);
    return 0;
}

您的矩阵被构造为数组的数组。但是,在C语言中,数组只是一个存储区域,可以在其中存储一系列相同类型的对象(在您的情况下为int)。符号m由C编译器解释为

  • 表示矩阵的初始元素的地址,或者更确切地说,因为您的矩阵是一个数组数组,所以它是矩阵的初始行的地址;和
  • 指的是矩阵初始行的类型,它本身就是数组类型int[NO_COLUMNS]

问题是,除非您愿意对类型进行硬编码,否则没有真正整洁,直接的方法来为预编译函数指定类型int[NO_COLUMNS]。因此,一种处理create_matrix()中矩阵的相对简单的方法将是如图所示的单个线性数组。

这里要理解的一点是C无法理解矩阵的形状。 C看到的是线性存储区域,而不是行和列。

要把握的另一点是,传递给数组的函数仅接收数组的初始地址。如果需要大小,则必须单独传递。