2010-10-30 5 views
3

Je fais du jeu de la vie en réseau 2D. J'ai besoin de déterminer quand toutes les cellules adjacentes sont vides, donc je viens de les tester tous. Cela fonctionne bien à moins que la cellule contrôlée soit la limite. Alors, bien sûr, tester X + 1 jette une exception car l'index est hors des limites du tableau. Puis-je gérer cela en quelque sorte au lieu de gérer l'exception? MerciComment vérifier en toute sécurité les limites des tableaux

+0

e sont 2 formes de tableaux 2D. Une simple déclaration clarifierait beaucoup cette question. –

Répondre

3

Si vous voulez la vitesse que vous aurez à traiter les cellules de bord différemment et traiter le reste avec un

for(int x = 1; x < Size-1; x++) // these all have x-1 and x+1 neighbours 
1

Oui, avant d'accéder à l'élément à l'index i + 1, vérifier si i + 1 est strictement inférieure à array.Length.

+0

Mais il faudrait beaucoup de conditions alors, non? y moins que array, y plus grand, x moins, x plus grand – Loj

+3

C'est mieux que d'attraper des exceptions qui sont exceptionnelles. –

3

utilisez GetLength(0) et GetLength(1) pour obtenir la largeur et la hauteur du tableau.

Il y a aussi une astuce de performance que le moteur d'exécution utilise pour ses propres vérifications de limites: la conversion en unsigned int pour réduire les deux contrôles en un seul. Mais puisque cela coûte la lisibilité, vous l'utilisez si la vérification est vraiment critique.

(i >= 0) && (i < length) 

devient

(uint)i < length 
+0

Très soigné, viens d'utiliser la version UINT. – Dib

1

J'ai créé une méthode d'extension pour une Tableau 2D pour vérifier si les limites sont:

public static class ExtensionMethods 
{ 
    public static bool In2DArrayBounds(this object[,] array, int x, int y) 
    { 
     if (x < array.GetLowerBound(0) || 
      x > array.GetUpperBound(0) || 
      y < array.GetLowerBound(1) || 
      y > array.GetUpperBound(1)) return false; 
     return true; 
    } 
} 
Questions connexes