【问题标题】:Initialising an associative array of struct values and string keys初始化结构值和字符串键的关联数组
【发布时间】:2012-01-17 10:25:03
【问题描述】:

(对于“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. */
}

【问题讨论】:

  • 编译器给你什么错误?根据:d-programming-language.org/hash-map.html,我在您的代码中没有看到任何错误
  • 我得到不同的错误取决于我把它放在哪里。目前,通过将其放在 .d 文件的顶层,我得到“错误:不是关联数组初始值设定项”。我想这意味着语法关闭了?当我用谷歌搜索错误时,没有命中。 d 站点也没有列出关联数组初始化器的特殊语法。我很困惑。
  • 你有没有尝试在几个语句中初始化它?助记符信息[字符串] 助记符表; mnemonic_table["ADD"]={ mnemonic_format.Format3M, 0x18 };
  • 然后我得到“没有声明符 mnemonic_table["ADD"] 的标识符”,完全使用您的代码。注意:这只是错误的第一行,所有的助记符都会被提及。
  • 我已经编辑了我的问题帖子以展示一种可行的方式 --- 但我真的希望有更好的语法。我希望有人会发布不同的解决方案。

标签: initialization d associative-array


【解决方案1】:

在 D 中,内置的关联数组字面量总是在运行时创建,因此通过在声明处为其分配一些值来初始化全局关联数组目前是不可能的。

正如您自己发现的那样,您可以通过为 module constructor 中的关联数组分配一个值来解决此问题。

代码中的另一个问题是结构初始化文字。您应该更喜欢 D-style 结构初始化器而不是 C 风格的初始化器。

例子:

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);
}

【讨论】:

  • 谢谢!正是我想要的。不知道 D 风格的结构初始化程序。我今天已经阅读了很多关于此的页面,但在任何地方都没有看到它。另外,Foo(a:1, b:"hurr") 语法呢?似乎不起作用,但到处都提到。 ://
  • 指定要初始化的结构成员仅限于 C 风格的结构初始化程序。您可能需要提交增强请求以允许它们在 D 样式初始化程序中使用
  • 当我尝试使用 C 风格的初始化器时,它们甚至都不起作用。 :/ 我只有 2 个成员,所以不是那么重要,但仍然。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-26
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2014-08-05
相关资源
最近更新 更多