Как инициализировать глобальный массив структур в D? - PullRequest
3 голосов
/ 25 августа 2009

В помощь моему единоличному стремлению заполнить SO вопросами D (= p) я столкнулся с другой проблемой; инициализация массива структур по всему миру. Обратите внимание:

struct A
{
    int a;
    float b;
}

A[2] as;
as[0] = {0, 0.0f};
as[1] = {5, 5.2f};

void main() {}

Результат:

$ dmd wtf.d 
wtf.d(8): no identifier for declarator as[0]
wtf.d(9): no identifier for declarator as[1]

Просматривая документы по Цифровому Марсу , я не вижу ничего совершенно очевидного для меня, поэтому я снова обращаюсь к отважным обитателям Переполнения стека! Я предполагаю, что сообщение об ошибке не имеет ничего общего с реальной проблемой, так как [0] является идентификатором (но dmd считает, что это декларатор, который AFAICT просматривает документы , это не так)?

Ответы [ 2 ]

6 голосов
/ 25 августа 2009

Я не думаю, что вы можете инициализировать элементы для каждого элемента, как это. Будет ли это работать?

A[2] as = [
    {0, 0.0f},
    {5, 5.2f}
];

Подумайте, что произойдет, если в вашем примере вы упомянули as[0] более одного раза:

as[0] = {0, 0.0f};
as[0] = {1, 1.0f};

Каким будет значение as[0] при инициализации программы? Это становится больше похоже на операторов , чем инициализаторов .

Обратите внимание, что в D вы можете инициализировать элементы массива по определенным индексам, например так:

A[2] as = [
    0: {0, 0.0f},
    1: {5, 5.2f}
];

Это было бы полезно, если у вас массив большего размера (например, A[10]) и вам нужно только инициализировать некоторые элементы. См. Массивы в справочной документации D для получения дополнительной информации.

3 голосов
/ 25 августа 2009

Это также будет работать, если вы хотите выполнить инициализацию один за другим

struct A
{
    int a;
    float b;
}

A[2] as;
as[0] = A(0, 0.0f);
as[1] = A(5, 5.2f);

void main() {}

Каждая структура получает конструктор по умолчанию, который принимает все аргументы по порядку, если вы явно не определяете конструктор (то есть static opCall). См StructLiteral

Но недостатком является то, что это, вероятно, сначала инициализирует массив значением по умолчанию, а затем изменяет значения одно за другим. Так что, вероятно, будет более эффективно использовать фактический синтаксис инициализации, если вы заранее знаете все значения.

...