Есть ли простой способ назначить массив структуры - PullRequest
2 голосов
/ 08 июня 2011

У меня есть структурный массив, подобный этому:

struct VERTEX_FMT
{
    float x, y, z, u, v;
    const static DWORD FVF = (D3DFVF_XYZ | D3DFVF_TEX1);
};
VERTEX_FMT vertices[] = {
    {-1.0f, -1.0f,  0.0f,  0.0f,  0.0f},
    {-1.0f,  1.0f,  0.0f,  0.0f,  1.0f},
    { 1.0f, -1.0f,  0.0f,  1.0f,  0.0f},
    { 1.0f,  1.0f,  0.0f,  1.0f,  1.0f},
};

Есть ли простой способ присвоить массиву структур новое значение в C ++.

Ответы [ 4 ]

2 голосов
/ 08 июня 2011

Только если вы оберните массив в другой struct. Массивы довольно сильно разбиты в C, и C ++ решил, что std::vector достаточно, и что любая попытка исправить массивы в стиле C либо не приведет к серьезным изменениям, либо нарушит совместимость до такой степени, что вы не сможете поговорим о массивах в стиле Си.

Для таких POD-массивов, как ваш, memcpy - безусловно, самое простое решение. В более сложных случаях, и даже в большинстве случаев массивов struct s, подобных вашему, вам, вероятно, следует рассмотреть возможность использования std::vector. Или смесь: используйте массивы в стиле C для статических, инициализированных массивов, таких как тот, который вы показываете, так что компилятор будет подсчитывать количество элементов для вас, но используйте std::vector для всего, что не полностью инициализировано в определении или которая является целью назначения. Легко построить std::vector из массива стиля C, используя конструктор с двумя итераторами std::vector, поэтому нет никакого реального неудобства в наличии обоих типов.

1 голос
/ 08 июня 2011

если вы имеете в виду вставить новое значение, то нет - массив имеет фиксированный размер - вы не можете легко его изменить.Вам нужно будет создать совершенно новый массив - что вы действительно должны сделать, это посмотреть на std::vector

std::vector<VERTEX_FMT> new_array(vertices, vertices + sizeof(vertices)/sizeof(VERTEX_FMT));
// add the new entry in
new_array.push_back(...);

РЕДАКТИРОВАТЬ: на основании комментария кажется, что вы хотите сделать что-то вроде:

vertices[2] = {....}; // new values.

Самый быстрый способ сделать это в текущем стандарте - это использовать std::memcpy или std::copy, что-то вроде:

VERTEX_FMT nv = { ... };
// copy this in
std::memcpy(&vertices[2], &nv, sizeof(nv));
// the line below also works if you want to use purely standard algorithms.
//std::copy(&nv, (&nv) + 1, &vertices[2]);
0 голосов
/ 08 июня 2011

В текущем стандарте вы не можете сделать,

int a[3] = {1,2,3};
a[] = {4,5,6};

Но вы определенно можете получить его эффект, используя указатель на тип массива,

int a[3] = {1,2,3}, (*p)[3]; // <-- this syntax forces p to point only int[3]
p = &a;
int b[3] = {4,5,6,};
p = &b;
0 голосов
/ 08 июня 2011

Вы можете использовать std :: generate или какую-либо другую функцию алгоритма stl.

Как уже говорилось, в текущей версии c ++ нет других способов сделать это (это будет возможно в c ++ 0x)

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