2013-11-08 5 views
0

Моя функция C++ всегда возвращает значение true. Всегда. Даже если я изменил возвращаемое значение на «false», он все равно вернет true. Я бы смеялся, но я пропустил это на сцену, где это просто не имеет смысла для меня ВСЕ.C++ - Функция всегда возвращает true

(В случае, если кто заинтересован, код для Conway's Game Of Life)

#include <iostream> 
#include <SFML/Graphics.hpp> 


bool getCellStates(bool cells[16][16], int i, int j) 
{ 
    int alive = 0; 
    bool isAlive; 

    if(cells[i][j-1] && j-1 >= 0) 
     alive++; 
    if(cells[i+1][j-1] && i+1 <= 15 && j-1 >= 0) 
     alive++; 
    if(cells[i+1][j] && i+1 <= 15) 
     alive++; 
    if(cells[i+1][j+1] && i+1 <=15 && j+1 <= 15) 
     alive++; 
    if(cells[i][j+1] && j+1 <= 15) 
     alive++; 
    if(cells[i-1][j+1] && i-1 >= 0 && j+1 <=15) 
     alive++; 
    if(cells[i-1][j] && i-1 >= 0) 
     alive++; 
    if(cells[i-1][j-1]&& i-1 >=0 && j-1 >= 0) 
     alive++; 

    if(alive == 3) 
     isAlive = true; 
    else if(cells[i][j] && alive == 2) 
     isAlive = true; 
    else 
     isAlive = false; 

    return isAlive; // Also returns true if I change to 'return false;' 
} 


int main() 
{ 
    sf::RenderWindow window(sf::VideoMode(640, 480), "Game Of Life"); 

    bool cells[16][16]; 
    int i, j = 0; 

    for(i = 0; i < 16; i++) 
    { 
     for(j = 0; j < 16; j++) 
     { 
      cells[i][j] = false; 
      std::cout << i << ", " << j << ": " << cells[i][j] << std::endl; 
     } 
    } 

    for(i = 0; i < 16; i ++) 
    { 
     for(j = 0; j < 16; j++) 
     { 
      cells[i][j] = getCellStates[cells, i, j]; 
      std::cout << i << ", " << j << ": " << cells[i][j] << std::endl; 
     } 
    } 


    while(window.isOpen()) 
    { 
     sf::Event event; 
     while(window.pollEvent(event)) 
     { 
      if(event.type == sf::Event::Closed) 
       window.close(); 
     } 
    } 

    return 0; 
} 
+2

делает ли это даже скомпилировать? 'cells [i] [j] = getCellStates [cells, i, j];' –

+1

Если вы попытались использовать отладчик в первую очередь, вам не пришлось бы публиковать этот вопрос (так как вы увидите, что ваша функция никогда не звонят ... хотя вам, возможно, пришлось опубликовать другой вопрос, чтобы спросить, почему это было). Пожалуйста, не используйте stackoverflow как свою линию защиты _first_. – mah

+1

Мои извинения, это просто мой отладчик, изворотливый ... Я все еще учась его использовать. Также не покровительствуйте мне - я знаю, что не просто задаю вопрос, прежде чем исследовать его в первую очередь. Я ненавижу, когда высокомерные люди предполагают, что все остальные глупы. Кроме того, да, он компилируется. – otah007

ответ

8

Проблема заключается не в функции, но на месте вызова (до тех пор, как это сайт вызов). Используйте круглые скобки для вызова функции, а не скобки.

cells[i][j] = getCellStates(cells, i, j); 

Вы преобразуете указатель на функцию, логическое значение, которое действительно всегда true. Подсчет указателей функций является нестандартным расширением, поэтому включите предупреждения компилятора и педантизм, чтобы предотвратить подобные ошибки. Для GCC и clang я рекомендую следующие флаги:

-Wall -Wextra -Werror -pedantic 
+3

Другая жертва какого-то дикого нестандартного расширения GCC. По-видимому, GCC позволяет арифметику указателя на указателях функций ... Смешно. – AnT

+0

Благодарим вас за ответ. И хотя я не знаю, что ваш комментарий означает, что AndreyT I AM использует GCC так ... Я обвиняю компилятор;) – otah007

Смежные вопросы