【问题标题】:Unsized Matrixes in C: how to pass them as an argument to a function, manipulate and return them in my code?C 中未调整大小的矩阵:如何将它们作为参数传递给函数,在我的代码中操作并返回它们?
【发布时间】:2019-10-23 04:17:41
【问题描述】:

我想知道如何将可变行和列的矩阵传递给函数,在函数内部对其进行转换,然后在 C 中返回它。

这是我正在尝试构建的代码。

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


void **f(int **m, int w, int h);

int main()
{
  int A[3][3]={{1,2,3},{4,5, 6},{7,8,9}};
  int B[3][2]={{1,2},{3, 4}, {5, 6}};

  f(A, 3, 3);
  f(B, 3, 2);

  return 0;
}

void **f(int **m, int w, int h )
{
    int i,j;
    int n[w][h];

    for(i=0;i<w;i++)
    {
      for(j=0;j<h;j++)
        n[i][j] = m[i][j] + 1;
        printf("%5d", m[i][j]);
    }
    return 0;
}

谁的编译返回以下错误:

main.c:20:5: 警告:传递“f”的参数 1 使指针从整数而不进行强制转换 [->Wint-conversion]
main.c:13:8:注意:预期为“int **”,但参数的类型为“int”
main.c:21:5: 警告:传递“f”的参数 1 使指针从整数而不进行强制转换 [->Wint-conversion]
main.c:13:8:注意:预期为“int **”,但参数的类型为“int”
分段错误(核心转储)

【问题讨论】:

  • 使用f(A, 3, 3),不要取消引用变量。

标签: c matrix multidimensional-array dynamic-arrays


【解决方案1】:

尽管多维数组长期以来一直是 C 语言中的二等公民,但现代版本为它们提供了更好的支持。如果数组大小包含在函数参数列表中的实际数组之前,它们可以形成该数组的维度。请注意,AB 现在是函数 f()last 参数:

void f(int w, int h, int m[w][h]);

int main()
{
  int A[3][3]={{1,2,3},{4,5, 6},{7,8,9}};
  int B[3][2]={{1,2},{3, 4}, {5, 6}};

  f(3, 3, A);
  f(3, 2, B);

  return 0;
}

void f(int w, int h, int m[w][h])
{
    int n[w][h];

    int i, j;

    for(int i;i<w;i++)
    {
      for(int j;j<h;j++)
        n[i][j] = m[i][j] + 1;
      printf("%5d", m[i][j]);
    }
}

我不记得是哪个版本的 C 引入了这个,但可以肯定 int **m 参数不正确,因为 m 不是指向指针(或指针数组)的指针。

同样重要的是,此语法不会强制数组根据参数重新排序,因此如果数组在定义时为 [10][3],则在将其描述为 [10][3]功能。这只是数组访问的语法糖。

【讨论】:

  • C99 引入了 variable length arrays (VLAs) 并且 C11 使它们成为可选的。所以并不是所有的编译器都会支持这个答案中的代码,但对于支持它的编译器来说,它绝对是最好的解决方案。
猜你喜欢
  • 2022-10-12
  • 2017-11-16
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 2013-07-11
  • 1970-01-01
  • 2019-04-03
相关资源
最近更新 更多