【问题标题】:Why is the struct unknown at compiletime in the code?为什么在代码中编译时结构未知?
【发布时间】:2015-08-13 12:00:16
【问题描述】:

我想知道如何更改下面的代码,这样bmBc 是在编译时计算的。下面的一个适用于运行时,但它并不理想,因为我需要在 compile-time 知道 bmBc 表。我很感激有关如何改进这一点的建议。

   import std.conv:to;
   import std.stdio;

    int [string]  bmBc;
    immutable string pattern = "GCAGAGAG";
    const int size = to!int(pattern.length);
    struct king {

            void  calculatebmBc(int i)()
            {
                    static if ( i < size -1 )
                           bmBc[to!string(pattern[i])]=to!int(size-i-1);

                  //        bmBc[pattern[i]] ~= i-1;

                    calculatebmBc!(i+1)();
            }
            void calculatebmBc(int i: size-1)() {

            }
    }

    void main(){
      king myKing;

      const  int start = 0;
      myKing.calculatebmBc!(start)();
     //1.   enum  bmBcTable =  bmBc;

    }

【问题讨论】:

  • 你能添加完整的代码示例吗?目前:ASIZE、ALPHABET、尺寸未知。还请指定编译器版本和平台。很可能您在 calculatebmBc!(S,C,I,i+1)(pattern ,bmBc) 中有无限递归
  • @sibnick ,谢谢,我刚刚编辑了代码,并将其剪切以指向我的确切问题。

标签: struct d template-meta-programming compile-time


【解决方案1】:

变量bmBcbmh 在编译时无法读取,因为您将它们定义为常规运行时变量。

您需要将它们定义为enums,或者可能是immutable,以便在编译时读取它们,但这也意味着您无法在初始化后修改它们。您需要重构代码以返回值,而不是使用 out 参数。

或者,您可以在运行时在模块构造函数内初始化它们。

【讨论】:

  • 我刚刚编辑了代码以清楚地重新陈述我的挑战。很抱歉模棱两可。
  • @Walker 答案仍然有效。 bmBc 是一个全局运行时可变变量;编译器不知道它的值,特别是因为对calculatebmBc 的递归调用会在运行时修改它。
猜你喜欢
  • 2021-07-27
  • 2014-06-26
  • 2019-09-09
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多