【问题标题】:C array dimension problemC数组维数问题
【发布时间】:2010-11-15 18:26:14
【问题描述】:

我有一个这样的 1653 行数组:

#define NUM_POLYGON_OBJECT_VERTEX 1653 * 3

static const float vertices[NUM_POLYGON_OBJECT_VERTEX] =
{
   {{2.4f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f} },
   ...
};

NUM_POLYGON_OBJECT_VERTEX 的正确值是什么?

谢谢

更新

我不知道用 C 编程,你付给我 -3 分。 难以置信

第二次更新 我收到以下错误:

warning: excess elements in scalar initializer

【问题讨论】:

  • 这将是 1653 * sizeof (*your_array),你不觉得吗?
  • @codeymanix:不。您查看的是指针的大小,而不是实际数组的大小。
  • 我正在寻找 NUM_POLYGON_OBJECT_VERTEX 的正确值。
  • @Vans:没有正确的值。你有一个多维数组,你只声明一个维度。
  • @VansFannel:已经有几个人试图更准确地了解你想知道的内容。你基本上总是用同样的短语来回答。你甚至没有给我们一个猜测的上下文。 “正确”值应该具有哪些属性?什么是你的“大小”?

标签: c multidimensional-array


【解决方案1】:
float arr[1653][2][3];

这取决于您所说的大小。对于总大小,它将是:

sizeof(float) * 1653 * 3 * 2

但是,找到总大小的最佳方法是:

sizeof(arr)

其中 arr 是数组变量。

【讨论】:

  • 我正在寻找 NUM_POLYGON_OBJECT_VERTEX 的正确值。
  • 如果您明确列出元素,则无需指定大小。元素列表的长度决定了数组的大小。
【解决方案2】:

至少在 IMO,正确的做法是将 NUM_POLYGON_OBJECT_VERTEX 完全排除在外:

static const float vertices[] =
{
   {{2.4f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f} },
   ...
};

然后编译器将根据初始化数据自动计算大小。之后要计算大小,您可以使用以下内容:

#define elements(array) (sizeof(array)/sizeof(array[0]))

但是请注意,您所拥有的似乎根本不是一个多维数组(也不是 C 最接近的等价物,一个数组数组)。由于您只有一组括号,因此您拥有的是一维数组。如果您想将其创建为多维数组,您可以执行以下操作:

static const float vertices[][3] =
{
   {{2.4f, 0.5f, 0.0f}, {0.0f, 0.0f, 1.0f} },
   ...
};

注意添加的[3]——它告诉编译器你想要的是一个由三个浮点数组成的数组。这意味着 vertices[0] 将是构成第一个顶点的三个浮点数的整个数组,而 vertices[0][1] 将(至少按照惯例)是第一个顶点的 x 值。

如果你这样定义数组,你仍然可以使用上面的elements宏——但是由于vertices[0]将是一个完整的顶点而不是单个float,元素的数量将是顶点而不是浮点数。

根据您包含的大括号,您可能实际上希望它是:

static const float lines[][2][3] = { /* ... */ };

现在你的支撑表明你有个顶点,一对顶点定义了一条线......

【讨论】:

  • 非常感谢您的回答。
  • 如果想要部分初始化数组(最少使用 0 初始化),第一个维度的长度可能是可用的。
【解决方案3】:

您是否尝试过对变量使用 sizeof

【讨论】:

  • 我正在寻找 NUM_POLYGON_OBJECT_VERTEX 的正确值。
【解决方案4】:

其中的元素数量在您给2 的示例中,但它花费的内存要多得多(6 * sizeof(float))。如果您想获得完整数组的大小,请将这些数字乘以 1653

【讨论】:

  • 我正在寻找 NUM_POLYGON_OBJECT_VERTEX 的正确值。
【解决方案5】:

它有两个索引大小。 1653 和 3。总体而言,其索引大小为 1653*3。

数据大小取决于编译器应用的“打包”模型(也称为“步幅”)。

【讨论】:

  • 尺寸 != 尺寸。 (也是一个 3d 数组)
  • @Billy ONeal:或者它可以是struct {float x, y, z} 的二维数组。或者它可以是struct {float x[3], y[3]} 的一维数组。无论哪种方式,大小应该都相同,但了解实际的数组类型会有所帮助。
  • @John: Err.. 不,它不能。 struct {float x, y, z} 的大小很可能大于3 * sizeof(float),因为编译器可能会插入填充。但是,作为数组,编译器可能不会插入填充。
  • @Billy:对,我只是按照 OP 当时写的内容进行,即“我有 1653 行看起来像 {{...},{...}} ";每个人都在假设它必须是一个 3D 数组,但根据所写的内容,其他解释是可能的。
【解决方案6】:

取决于几件事。

1) 大小是什么意思?您是指数组中的元素数量吗?你的意思是你的二维数组持有的数组数量吗?你的意思是整个数组的大小(以字节为单位)吗?你是指指针的大小吗?

2) 您的系统上的浮点数有多大?您可以使用 sizeof() 运算符找出答案。

【讨论】:

  • 这是一个 3d 数组,而不是 2d 数组。
  • 我正在寻找 NUM_POLYGON_OBJECT_VERTEX 的正确值。
【解决方案7】:

尺寸?嗯...取决于你想知道什么。

sizeof arr数组的大小(以字节为单位)(准确地说是chars,但在普通机器上也是如此),

(sizeof arr / sizeof *arr)数组中元素的数量 - 一个元素是一排浮点数。

关于里面的实际浮点数,最简单的方法就是使用sizeof arr / sizeof float

【讨论】:

  • 我正在寻找 NUM_POLYGON_OBJECT_VERTEX 的正确值。
  • 我不知道用 C 编程,你付给我 -3 分。难以置信
猜你喜欢
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2016-05-03
  • 2017-04-11
相关资源
最近更新 更多