2011-10-20 3 views
2

Je me sens comme un idiot pour demander ceci mais je ne peux pas pour la vie de moi comprendre pourquoi cette IndexOutOfRangeException se produit. (Je veux dire, je sais Pourquoi ça se passe, je ne sais pas ce qui est invalide au sujet de mon code) Vérifiez le code ci-dessous pour savoir où l'erreur est jeté:Pourquoi ce tableau int lance-t-il une exception IndexOutOfRangeException?

public int[, ,] FindTablePairings(System.Text.RegularExpressions.MatchCollection mcBegin, System.Text.RegularExpressions.MatchCollection mcEnd) 
    { 
     int[,,] intTablePairs = new int[mcBegin.Count, 1, 1]; 
     int[] intBegin = new int[mcBegin.Count]; 
     int[] intEnd = new int[mcBegin.Count]; 

     for (int q = 0; q < mcBegin.Count; q++) 
     { 
      intBegin[q] = mcBegin[q].Index; 
     } 
     for (int q = 0; q < mcEnd.Count; q++) 
     { 
      intEnd[q] = mcEnd[q].Index; 
     } 

     int intBeginCount = mcBegin.Count; 
     int intEndCount = mcEnd.Count; 
     int i = 0; 
     int j = 0; 
     int k = 0; 

     while (i < intBeginCount) 
     { 
      j = i; 
      while (j < intEndCount) 
      { 
       if (intBegin[i + 1] < intEnd[j]) 
       { 
        j++; 
       } 
       else 
       { 
        intTablePairs[i, 0, 0] = intBegin[i]; 
        intTablePairs[i, 1, 0] = intEnd[j]; 
        intEnd[j] = -1;       //EXCEPTION OCCURS HERE 
        break; 
       } 
      } 
      if (j == intEndCount) 
      { 
       intTablePairs[i, 0, 0] = intBegin[i]; 
       intTablePairs[i, 1, 0] = intEnd[j - 1]; 
       intEndCount--; 
      } 

      while (k < intEndCount) 
      { 
       if (intEnd[k] == -1) 
       { 
        k++; 
       } 
       else 
       { 
        intTablePairs[i,0,0] = intBegin[i]; 
        intTablePairs[i,1,0] = intEnd[k]; 
        intEnd[k] = -1; 
        k=0; 
        break; 
       } 
      } 
     } 

     return intTablePairs; 
    } 

Le code est simplement regarder index de caractères des occurrences des balises de début et des balises de fin. Rien de très compliqué ... mais le pire est que l'exception est lancée à intEnd[j] = -1;, et dans le débogueur, avant que cette instruction soit exécutée, tous les tableaux et MatchCollections sont correctement initialisés et remplis, y compris intEnd[]! J'ai débogué pour m'assurer que le tableau existe et est initialisé, et j'ai également nettoyé la solution et l'ai reconstruite.

Quelqu'un a des suggestions sur ce qui se passe ici?

Répondre

5

je crois que l'erreur est en fait sur cette ligne

intTablePairs[i, 1, 0] = intEnd[j]; 

Le problème ici est que vous avez défini la longueur de 2 dernières dimensions à la fois être 1 sur intTablePairs. L'utilisation de l'index 1 est donc invalide car elle est égale à la longueur. Il semble que vous vouliez dire de définir les limites que

int[,,] intTablePairs = new int[mcBegin.Count, 2, 2]; 
+0

Il semble qu'une erreur se produit sur la ligne 'intEnd [j] = -1'. –

+1

@ AS-CII qui ne peut pas être une erreur, sinon la ligne directement au-dessus serait également erronée. Les deux accèdent 'intEnd [j]'. – JaredPar

+0

Je n'ai pas écrit votre solution était erronée;) Je pensais qu'il avait fait une erreur en copiant son code dans StackOverflow. –

0

peut-être regarder ceci:

int[] intEnd = new int[mcBegin.Count]; 

Remplacer mcBegin sur mcEnd et l'essayer.

0

Je suppose que intEnd doit être réglé avec une capacité mcEnd.Count. Ainsi, au lieu de:

int[] intEnd = new int[mcBegin.Count]; 

Vous devriez avoir:

int[] intEnd = new int[mcEnd.Count]; 

Hope it helps.

Questions connexes