代码之家  ›  专栏  ›  技术社区  ›  Bernard

如何在D中初始化结构的全局数组?

  •  3
  • Bernard  · 技术社区  · 15 年前

    为了帮助我一个人用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]
    

    浏览文档 Digital Mars 我真的看不到任何明显的东西,所以我再次转向栈溢出的勇敢的居民!我猜想错误消息与实际问题没有多大关系,就像[0] 标识符(但是 dmd 认为它是一个声明人,远远地看着 docs 不是吗?

    2 回复  |  直到 15 年前
        1
  •  6
  •   Greg Hewgill    15 年前

    我不认为你能像那样在每个元素的基础上初始化元素。这行吗?

    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] )只需要初始化一些元素。见 Arrays 有关更多信息,请参阅D参考文件。

        2
  •  3
  •   Baxissimo    15 年前

    如果您想一个接一个地进行初始化,这也可以工作。

    struct A
    {
        int a;
        float b;
    }
    
    A[2] as;
    as[0] = A(0, 0.0f);
    as[1] = A(5, 5.2f);
    
    void main() {}
    

    如果不显式定义构造函数(即静态opcall),则每个结构都会得到一个默认的构造函数,按顺序排列每个参数。参见 StructLiteral

    但缺点是,这可能会先将数组初始化为默认值,然后逐个更改这些值。因此,如果预先知道所有值,那么使用实际的初始化语法可能会更有效。