2010-04-01 8 views
3

Essayer de compter le nombre d'éléments dans le tableau n'est pas égal à 0, est-ce que quelque chose ne va pas? Je voudrais vérifier toutes les valeurs du tableau (c'est un tableau de sudoku) et quand tous les éléments sont "pleins", je dois retourner vrai. Est-ce que quelque chose est éteint?la boucle de tableau ne fonctionne pas correctement? C++

bool boardFull(const Square board[BOARD_SIZE][BOARD_SIZE]) 
{ 
    int totalCount=0; 
    for (int index1 = 0; index1 < BOARD_SIZE; index1++) 
     for (int index2 = 0; index2 < BOARD_SIZE; index2++){ 
      if(board[index1][index2].number!=0) 
       totalCount++; 
     } 
    if(totalCount=81) 
     return true; 
    else 
     return false; 
+1

Formatez votre code la prochaine fois. –

+0

Je tente de copier ma réponse dans http://stackoverflow.com/questions/2563553/tell-the-program-what-to-do-when-no-save-data-is-found-nsuserdefaults-iphone/2563576# 2563576 ici. – kennytm

+1

Pourquoi utiliser des constantes pour la dimension et la valeur '81' codée en dur? n'est-ce pas censé être 'BOARD_SIZE * BOARD_SIZE'? Vous avez une valeur magique ici: p –

Répondre

12

Vous avez = plutôt que ==

if (totalCount == 81) 

est la bonne ligne.

Faire cela avec un seul "=" attribue en fait la valeur de 81 à totalCount, de sorte que votre test est essentialy:

if (81) 

Et comme en C++ quoi que ce soit différent de zéro est vrai, ce qui est toujours vrai

+0

+1 Bien repéré. –

+0

Je regarde cela depuis trop longtemps. Merci, maintenant je me sens stupide. – codefail

+5

Prenez l'habitude de compiler avec des niveaux élevés d'avertissements activés - le compilateur aurait repéré ceci pour vous – pm100

1

Vous avez un = qui devrait être un ==. C'est tout ce que je vais dire, puisque c'est les devoirs.

Aussi, pourquoi avez-vous une constante pour BOARD_SIZE, puis vérifiez à 81 à la fin? Ne serait pas la vérification contre BOARD_SIZE * BOARD_SIZE être mieux?

+0

Je suppose que cela fonctionne aussi, mais dans ce cas BOARD_SIZE ne change pas (déclaré comme const ailleurs) donc c'est bon (quoique mauvaise programmation?) – codefail

+0

@igor, bien sûr, mais si cela ne change pas pourquoi n'avez-vous pas 9 partout, c'est moins tapant que «BOARD_SIZE» si vous ne vous souciez pas d'être une constante. –

0

Est-ce que le If (totalCount = 81) est une faute de frappe dans ce message ou votre code? On dirait que vous avez attribué la valeur là-bas.

0

Vous pouvez quitter la fonction dès que vous trouverez le premier 0, et il est possible de résoudre ce avec une seule boucle:

bool boardFull(const Square board[BOARD_SIZE][BOARD_SIZE]) 
{ 
    const Square* p = board[0]; 
    for (int n = BOARD_SIZE * BOARD_SIZE; n; --n, ++p) 
    { 
     if (p->number == 0) return false; 
    } 
    return true; 
} 

Mais je préfère des algorithmes pour les boucles écrites à la main:

struct Square 
{ 
    int number; 

    bool is_zero() const 
    { 
     return number == 0; 
    } 
}; 

#include <algorithm> 
#include <functional> 

bool boardFull(const Square board[BOARD_SIZE][BOARD_SIZE]) 
{ 
    return std::find_if(
     board[0], 
     board[BOARD_SIZE], 
     std::mem_fun_ref(&Square::is_zero) 
    )== board[BOARD_SIZE]; 
} 
Questions connexes