Проблема измерения массива C - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть массив с 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?

Спасибо

UPDATE

Я не имею представления о программировании на C, а вы заплатили мне -3 очка. Невероятная

ВТОРОЕ ОБНОВЛЕНИЕ Я получаю следующую ошибку:

warning: excess elements in scalar initializer

Ответы [ 7 ]

5 голосов
/ 15 ноября 2010
float arr[1653][2][3];

Это зависит от того, что вы подразумеваете под размером.Для общего размера это будет:

sizeof(float) * 1653 * 3 * 2

Однако лучший способ найти общий размер будет просто:

sizeof(arr)

, где arr - переменная массива.

3 голосов
/ 15 ноября 2010

По крайней мере, 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] - это говорит компилятору, что вам нужен массив массивовтри плавания за штуку.Это будет означать, что вершины [0] будут всем массивом из трех чисел с плавающей точкой, составляющих первую вершину, а вершины [0] [1] будут (по крайней мере условно) значением x первой вершины.

Если вы определите массив таким образом, вы все равно можете использовать макрос elements, описанный выше - но поскольку vertices[0] будет полной вершиной вместо единственного float, число элементов будет числомвершин вместо числа с плавающей точкой.

Исходя из включенных вами фигурных скобок, вы, возможно, захотите, чтобы это было:

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

Прямо сейчас ваша связь говорит, что у вас есть пары вершин, а пара вершин определяет линию ...

2 голосов
/ 15 ноября 2010

Вы пытались использовать sizeof против переменной?

0 голосов
/ 15 ноября 2010

Размер? Ну ... Зависит от того, что вы хотите знать.

sizeof arr - это размер массива в байтах (точнее, в char с, если быть точным, но на обычных машинах то же самое),

(sizeof arr / sizeof *arr) - это количество элементов в массиве - один элемент является строкой с плавающей точкой.

А что касается числа действительных чисел внутри, самый простой способ - просто использовать sizeof arr / sizeof float для этого.

0 голосов
/ 15 ноября 2010

Зависит от нескольких вещей.

1) Что вы подразумеваете под размером?Вы имеете в виду количество элементов в массиве?Вы имеете в виду количество массивов, хранящихся в вашем двумерном массиве?Вы имеете в виду размер в байтах всего массива?Вы имеете в виду размер указателя?

2) Насколько большой в вашей системе float?Вы можете узнать с помощью оператора sizeof ().

0 голосов
/ 15 ноября 2010

Имеет два размера индекса. 1653 и 3. Общий размер индекса 1653 * 3

.

Размер данных зависит от того, какую модель «упаковки» (иначе говоря, «шаг») применяет компилятор.

0 голосов
/ 15 ноября 2010

количество элементов в нем приведено в примере, который вы дали 2, но объем памяти, который он стоит, намного больше (6 * sizeof(float)). Умножьте эти числа на 1653, если вы хотите иметь размер всего массива

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...