• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

cout zmienia działanie funkcji

VPS Starter Arubacloud
0 głosów
215 wizyt
pytanie zadane 17 lutego 2018 w C i C++ przez BlinkyShay Obywatel (1,190 p.)
Witam!
Tak jak w tytule, polecenie cout zmienia dane wyjściowe w funkcji.
Jestem w trakcie tworzenia gry w warcaby, stworzyłem rekurencyjną funkcje która ma na celu podanie największej ilości bić jaka jest możliwa do wykonanie dla aktualnego gracza.
Po sprawdzeniu działania tej funkcji postanowiłem wykomentować z niej wszystkie pomocnicze couty.
Kiedy to zrobiłem funkcja w pewnych sytuacjach zamiast zwrócić 0 ( czyli brak bić ), zwracała 1 ( czyli 1 bicie ).
Odkryłem wtedy że aby funkcja działała poprawnie wystarczy zostawić jeden cout w środku funkcji.
Funkcja jest ustawiona tak aby sprawdzała bicia tylko dla czarnego, na planszy jest to [c], biały to [b].
Aby zrozumieć o co dokładnie mi chodzi należy uruchomić program, następnie wybrać jedną z kilku plansz testowych. Polecam najpierw na klawiaturze wybrać numer 3, jest na nim sytuacja z biciem dla czarnego.
W tym przypadku funkcja prawidłowo zwróci liczbę 1.
Potem należy ponownie włączyć program i wybrać opcje 7, jest to sytuacja w której jest bicie ale dla białego.
Jako że funkcja sprawdza cały czas bicie dla czarnego w tej sytuacji funkcja powinna zwrócić 0, ponieważ bicie dla czarnego jest niemożliwe ze względu na to że po biciu pionek znajdował by się po za planszą.
Mimo tego funkcja zwróci 1.
Ale jeśli w kodzie funkcji, która jest pierwszą funkcją w kodzie i nosi nazwę sprawdzenieIlosciBicia, usuniemy znaczniki "//" przed ostatnim coutem "//cout << bicie_lewo << " " << bicie_prawo << " " << najlepsze_bicie << endl;", po skompilowaniu w przypadku planszy nr 3 dostaniemy 1, a w przypadku nr 7 dostaniemy 0.
Jednym słowem funkcja będzie działała poprawnie.
Link do kodu źródłowego: http://wklej.org/id/3369474/
Używam codeblocksa, co ciekawe sprawdziłem ten sam kod w devie i tam wszytsko działa normalnie.
Mimo wszystko wolałbym korzystać z codeblocksa więc proszę o pomoc C:

1 odpowiedź

0 głosów
odpowiedź 17 lutego 2018 przez adrian17 Ekspert (344,100 p.)
wybrane 18 lutego 2018 przez BlinkyShay
 
Najlepsza

cout zmienia działanie funkcji

Brzmi jak standardowy undefined behavior - coś głupiego się napisanego w samym kodzie.

Dwie rzeczy na szybko widać:

if(plansza[i-2][j-2]==puste && i-2>=0 && j-2>=0)

Czytasz tablicę przed sprawdzeniem czy indeksy są poprawne; sprawdzaj je najpierw.

Poza tym, możliwe są ścieżki kodu (np gdy powyższy if się nie wykona) w których zmienne `bicie_lewo`, `bicie_prawo` nigdy nie będą zainicjalizowane - albo je zainicjalizuj na górze funkcji, albo obsłuż wszystkie kombinacje if/else.

komentarz 18 lutego 2018 przez BlinkyShay Obywatel (1,190 p.)
Dzięki wielkie za pomoc!!!
Tak jak napisałeś najprostszym rozwiązaniem było zadeklarowanie wartości false na początku funkcji.
Mam jednak jeszcze jedno pytanie, próbowałem znaleźć dobre wyjaśnienie undefined behavior i nadal do końca nie rozumiem o co chodzi.
Czy mógłbyś mi przybliżyć co one oznacza?
komentarz 18 lutego 2018 przez adrian17 Ekspert (344,100 p.)

Mam jednak jeszcze jedno pytanie, próbowałem znaleźć dobre wyjaśnienie undefined behavior i nadal do końca nie rozumiem o co chodzi.

Gdy wychodzisz poza tablicę:

int tab[5];
// ...
int x = tab[100];

Albo używasz niezainicjalizowaną zmienną

int x;
// ...
int y = x;

Może stać się... cokolwiek. Możesz dostać 0, 1, 123, program może się zawiesić, crashować lub w ogóle nie uruchomić. W Twoim przypadku, "cokolwiek" oznaczało, że czasem dawał w wyniku 1, a czasem 0.

Podobne pytania

0 głosów
1 odpowiedź 397 wizyt
0 głosów
1 odpowiedź 135 wizyt
pytanie zadane 27 maja 2020 w C i C++ przez Hubert_123 Początkujący (380 p.)
0 głosów
1 odpowiedź 219 wizyt
pytanie zadane 10 kwietnia 2018 w C i C++ przez niezalogowany

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...