【问题标题】:How to write multi-dimensional arrays in functions? C programming for beginners如何在函数中编写多维数组?适合初学者的 C 编程
【发布时间】:2015-04-17 15:23:55
【问题描述】:

我是一年级学生,我从事 C 编程。请不要对我这么刻薄。

您能否展示如何在函数中使用和编写多维数组?

我研究了数组和函数 arg 输入。

我读到第一个维度对编译器来说并不重要。它检查数组中的第二个和更多维度,因此您必须在函数中指定它才能使其工作。

我尝试了不同的数组组合以使其工作,但没有找到解决方案。

我的代码有一小段:

int size=5,location_x=10,location_y=10,s=NULL,l_x, l_y, status=2;

int stage_3(float[][int],int [],int [],int []);

int main()
{
float location[l_x][l_y];
int x[size], y[size], z[size];

if(!stage_3(location[l_x][l_y],x[size],y[size],z[size]))
    return 0;
}

int stage_3(float location[][int l_y],int x[size],int y[size],int wt[size])
{
  return 0;
}

13|错误:'int'之前的预期表达式

13|错误:在 'int' 之前需要 ';'、',' 或 ')'

我知道问题在于那些 [][]。它们不是常数。 该程序将它们作为变量,您可以通过 scanf 在可访问范围内随意选择,以获得更大的灵活性。

【问题讨论】:

  • c 中的选项很少,您可以使用malloc() 并动态分配数组,或者您可以执行int stage_3(size_t size, size_t l_y, float location[][l_y], int x[size], int y[size], int wt[size]) 之类的操作
  • @iharob 所以你想说如果我做 malloc(location[l_x][l_y]) 它将初始化内存块,你只需在任何函数的任何地方使用?
  • 不,这是不正确的,由于您是初学者,因此您必须避免使用malloc(),因此很难理解指针的确切工作原理,而且对于malloc(),您必须承担新的责任,@ 987654326@malloc()ed 块。
  • 很抱歉我这么笨。但我不明白这些内存块是如何工作的。我将 size_t 用于字符串,并且还有指针。我需要使用指针吗?天哪,我看起来有那么愚蠢吗...
  • 不,你只是一个随机菜鸟,做一个没关系,不要担心,避免指点,直到你觉得你真的理解 i> 所有其他概念。

标签: c arrays function


【解决方案1】:

这个原型不能工作:

int stage_3(float[][int],int [],int [],int []);

您需要给出第一个数组第二维的实际大小。如果该大小不是编译时常量,那么您最好的选择可能是使用可变长度数组。这是一个很好的方法:

int stage_3(int l_y, float location[][l_y],int x[],int y[],int z[]);

当然,必须更改函数定义以匹配,如果您使用附加参数来表示变量维度,如上所述,那么您也必须在函数调用中包含额外参数。

VLA 在 C99 中是新的;一些编译器仍然需要被指示使用 C99 模式来编译使用它们的代码。

【讨论】:

  • 额外的参数 (l_y) 已经作为全局包含(未初始化),换句话说:您不需要包含 int l_y,只需初始化它或在运行时分配一些值. An example
  • 是的,您可以依赖全局数组维度,而不是将维度作为函数参数。这样做将允许函数签名更类似于 OP 开始的函数签名。然而,就风格和良好做法而言,我不推荐这种方法。
  • 我同意,最好将维度传递给函数,但you must include the extra argument in your function call 不正确,因为l_y 已经定义为全局:int size=5,location_x=10,location_y=10,s=NULL,l_x, l_y, status=2;
  • 哦,我明白你在说什么,@AlterMann。好的,我已经更新了我的答案,以避免暗示将变量维度的大小作为函数参数传递是在这项工作中使用 VLA 的唯一方法。不过,由于 OP 缺乏经验,因此我将为他详细介绍他拥有的所有其他替代方案,并坚持只推荐一个。
猜你喜欢
  • 1970-01-01
  • 2018-05-05
  • 2014-06-20
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多