2015-08-13 7 views
0

Мне было интересно, как я могу изменить код ниже, так что bmBc вычисляется во время компиляции. Один ниже работает во время выполнения, но он не идеален, так как мне нужно знать таблицу bmBc во время компиляции. Я мог бы оценить совет, как я мог бы улучшить это.Почему структура неизвестна в compiletime в коде?

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; 

    } 
+0

Можете ли вы добавить образец полного кода? В настоящее время: ASIZE, ALPHABET, размер неизвестен. Также укажите версию и платформу компилятора. Скорее всего, у вас бесконечная рекурсия в calculatebmBc! (S, C, I, i + 1) (pattern, bmBc) – sibnick

+0

@sibnick, спасибо, я только что отредактировал код и отрезал его, чтобы указать на мою точную проблему. – Walker

ответ

1

Переменные bmBc и bmh не могут быть прочитаны во время компиляции, так как вы определяете их как обычные переменные среды выполнения.

Необходимо определить их как enum s или, возможно, immutable, чтобы прочитать их во время компиляции, но это также означает, что после инициализации вы не можете их модифицировать. Вам нужно реорганизовать свой код, чтобы возвращать значения вместо использования параметров.

В качестве альтернативы вы можете инициализировать их во время выполнения внутри конструктора модуля.

+0

Я только что отредактировал код, чтобы четко переустановить мой вызов. Мне жаль, что я двусмыслен. – Walker

+1

@Walker Ответ по-прежнему стоит. 'bmBc' - глобальная изменяемая переменная runtime; компилятор не знает его значения, особенно потому, что рекурсивный вызов 'calculatebmBc' изменяет его во время выполнения. –