【问题标题】:move Typedef enum array in another function在另一个函数中移动 Typedef 枚举数组
【发布时间】:2017-05-14 00:34:28
【问题描述】:

我想将数组移动到另一个函数(类型为void)中,以更改数组的值,但每次我在gcc下都会出错

我有以下规则:

  1. 本练习禁止使用全局变量,
  2. 我们希望通过引用移动数组而不是使用指针:

.

#include <stdio.h>

typedef enum {F=0,T=1} Mat;

//==========================//

void unknown(Mat b[][][]){
    b[0][0][0]=7;
    printf("%d\n",b[0][0][0]);
}

//=========================//

int main(void){

    Mat b[2][2][2];

    b[0][0][0]=1;
    printf("%d\n",b[0][0][0]); //before the unknown

    uknown(b);
    printf("%d\n",b[0][0][0]); //after unknown
    return 0;
}

我有以下错误:

test.c:7:18: 错误:数组类型有不完整的元素类型‘Mat[] {aka 枚举 []}' void unknown(Mat b[][][]){ ^ test.c:在函数'main'中:test.c:21:9:错误:形式参数1的类型不完整未知(b); ^

问题是:我需要更改数组的值,不是在 main 中,而是在函数 void unknown 中,并在 main 中检查(在数组的 void unknown 值发生变化之后Mat b)如果这个数组通过引用改变了这个值,有什么问题?我需要在代码中更改什么?

(我的gcc版本:gcc(Ubuntu 5.4.0-6ubuntu1~16.04.4)5.4.0 20160609)

【问题讨论】:

  • 未知函数中,必须指定最后两个维度,可以指定第一个。 Mat b[][2][2].
  • 关于您的规则 #2,在 C 中没有引用的概念。在这种情况下,您实际上是通过指针传递。您可以查找“数组衰减”以获取更多信息。这个答案详细说明了stackoverflow.com/questions/1461432/…
  • 您知道b[2][2][2]b[8] 在这里可以互换,当您将数组传递给函数时,它们会衰减为指针,因此Mat b[8];void unknown(Mat *b) 可能会使您的代码更易于阅读
  • @EliasVanOotegem:我看不出b[2][2][2]b[8] 是如何等效的。第一个需要三个下标来找到基础值;第二个只需要一个下标。至少,你已经过分简化了你想说的话。在最坏的情况下,你完全错了。

标签: c gcc multidimensional-array typedef


【解决方案1】:

在将数组传递给函数时,必须指定除第一个以外的所有数组维度;您可以指定第一个维度。

因此:

#include <stdio.h>

typedef enum { F = 0, T = 1 } Mat;

static void unknown(Mat b[][2][2])
{
    b[0][0][0] = 7;
    printf("%d\n", b[0][0][0]);
}

int main(void)
{
    Mat b[2][2][2];

    b[0][0][0] = 1;
    printf("%d\n", b[0][0][0]);

    unknown(b);
    printf("%d\n", b[0][0][0]);
    return 0;
}

输出:

1
7
7

你也可以写:void unknown(Mat b[2][2][2])

static 需要在我的默认编译选项下消除编译器警告。由于没有任何其他源文件,因此该函数不需要在该文件之外可见,可以是static。或者,我可以在定义函数之前声明函数:extern void unknown(Mat b[][2][2]);——这也将满足我使用的选项。 (extern 是可选的,但我使用它,即使还有其他人谴责这种做法;它与我在极少数情况下需要声明全局变量的方式是对称的。)我不做任何变量或函数在其源文件之外可见,除非有令人信服的理由使其可见——即使它是单个文件编译时也不可见。如果函数应该在源文件之外可见,则应该在定义函数的源文件和使用该函数的所有源文件中都使用的头文件中声明它。这确保了定义和声明是一致的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多