Инициализация ассоциативного массива структурных значений и строковых ключей - PullRequest
5 голосов
/ 10 декабря 2011

(для языка программирования "D")

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

Это то, чего я хочу достичь (и это не работает --- я не знаю, возможно ли это вообще):

mnemonic_info[string] mnemonic_table = [
        /* name,         format,          opcode */
        "ADD": {mnemonic_format.Format3M, 0x18},
        ...

        /* NOTE: mnemonic_format is an enum type. */
        /* mnemonic_info is a struct with a mnemonic_format and an ubyte */
];

Обратите внимание, что это прекрасно работает для массивов, индексируемых целыми числами.

Оптимально, я бы хотел, чтобы это оценивалось во время компиляции, так как я не буду его менять. Однако, если это невозможно, я был бы рад, если бы вы рассказали мне о наилучшем способе создания такого массива в / до немедленного выполнения.

Мне это нужно, потому что я пишу на ассемблере.

Я искал в SO и в интернете ответ, но мог найти только примеры с целыми числами и другими вещами, которые я не понимал или не мог заставить работать.

Мне пока очень нравится D, но, кажется, его трудно выучить, потому что в Интернете не так много учебников.

Спасибо!

С другой стороны: возможно ли использовать кортежи для элементов ассоциативного массива вместо пользовательской структуры?

Редактировать

Есть один способ, который я нашел до сих пор, но он довольно уродливый:

mnemonic_info[string] mnemonic_table;
static this() { // Not idea what this does.
        mnemonic_info entry;

        entry.format = mnemonic_format.Format3M;
        entry.opcode = 0x18;
        mnemonic_table["ADD"] = entry;

        /* ... for all entries. */
}

1 Ответ

6 голосов
/ 10 декабря 2011

В D встроенные литералы ассоциативного массива всегда создаются во время выполнения, поэтому инициализация глобального ассоциативного массива путем присвоения ему некоторого значения в месте объявления в настоящее время невозможна.

Как вы обнаружили, вы можете обойти это решениеэто путем присвоения значения ассоциативному массиву в конструкторе модуля .

Другая проблема в вашем коде - литералы инициализации структуры.Вы должны предпочесть D-style struct инициализаторы вместо C-style.

Пример:

struct Foo {
    int a;
    string b;
}

Foo[string] global;

static this() {
    global = [
        "foo" : Foo(1, "hurr"),
        "bar" : Foo(2, "durr")
    ];
}

void main() {
    assert(global["foo"].a == 1);
}
...