2015-08-13 1 views
0

Je me demandais comment je pourrais changer le code ci-dessous tel que le bmBc est calculé au moment de la compilation. Celui ci-dessous fonctionne pour l'exécution mais ce n'est pas idéal puisque j'ai besoin de connaître la table bmBc au moment de la compilation. Je pourrais apprécier des conseils sur la façon dont je pourrais améliorer cela.Pourquoi la structure est inconnue à compiletime dans le code?

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

Pouvez-vous ajouter un exemple de code complet? Actuellement: ASIZE, ALPHABET, la taille sont inconnues. Veuillez également spécifier la version du compilateur et la plate-forme. Très probablement vous avez une récursion infinie dans calculatebmBc! (S, C, I, i + 1) (motif, bmBc) – sibnick

+0

@sibnick, merci, je viens d'éditer le code, et le couper pour pointer vers mon problème exact. – Walker

Répondre

1

Les variables bmBc et bmh ne peuvent être lus au moment de la compilation parce que vous les définissez comme variables d'exécution régulières.

Vous devez les définir comme enum s, ou éventuellement immutable, pour les lire au moment de la compilation, mais cela signifie également que vous ne pouvez pas les modifier après l'initialisation. Vous devez refactoriser votre code pour renvoyer des valeurs au lieu d'utiliser des paramètres externes.

Vous pouvez également les initialiser lors de l'exécution à l'intérieur d'un constructeur de module.

+0

Je viens d'éditer le code pour redire clairement mon défi. Suis désolé d'être ambigu. – Walker

+1

@Walker La réponse est toujours là. 'bmBc' est une variable d'exécution globale mutable; le compilateur ne connaît pas sa valeur, notamment parce que l'appel récursif à 'calculatebmBc' le modifie au moment de l'exécution. –