poziom 3, temat 24: "przekazywanie argumentów funkcji przez referencję" - niepoprawne działanie programu drugiego z przykładów
Ostatnio zmodyfikowano 2014-09-17 18:35
matex44 Temat założony przez niniejszego użytkownika |
poziom 3, temat 24: "przekazywanie argumentów funkcji przez referencję" - niepoprawne działanie programu drugiego z przykładów » 2014-09-17 11:09:03 Po skompilowaniu programu i jego uruchomieniu, program wypisuje w nieskończoność komunikat z pętli while: "Podaj liczbe;" , natomiast po usunięciu z niego metod: std::cin.clear(); oraz std::cin.sync(); początkowo działa poprawnie prosząc jednorazowo o podanie liczby i w przypadku podania "dobrej" liczby wszystko jest ok, jednak gdy się poda jakiś inny znak niż liczba całkowita pojawia się ten sam problem z wypisywaniem próśb podania liczby w nieskończoność. Przypuszczam, że problem nie leży w samym kodzie tylko leży od po mojej stronie. Proszę o sugestię co może być nie tak.
Pozdrawiam |
|
Mateus. |
» 2014-09-17 12:48:58 Kod? |
|
Monika90 |
» 2014-09-17 12:52:10 Czy jak zastapisz go takim, to działa? #include <iostream> #include <limits>
int main() { using namespace std; int liczba; cout << "Podaj liczbe: "; while( !( cin >> liczba ) ) { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "To nie liczba, podaj liczbe: "; } cout << "Podano " << liczba << endl; }
|
|
matex44 Temat założony przez niniejszego użytkownika |
» 2014-09-17 14:37:16 kod o który chodzi to: #include <iostream>
bool wczytaj_liczbe( int & liczba ) { std::cin.clear(); std::cin.sync(); std::cin >> liczba; return std::cin.good(); }
int main() { int x; do { std::cout << "Podaj liczbe: "; } while( wczytaj_liczbe( x ) == false ); std::cout << "Liczba podana to: " << x << std::endl; return 0; }
Tak Monika90, podany kod działa, ale chciałbym się dowiedzieć dlaczego powyższy kod u mnie nie działa i dlaczego podany przez Ciebie kod działa :) |
|
Monika90 |
» 2014-09-17 15:15:38 std::cin.sync(); ma efekt jakiego oczekiwał autor kursu w pewnych implementacjach biblioteki standardowej używanych w systemie Windows, a ma zupełnie inny efekt we wszystkich pozostałych implementacjach (np. dla Linuksa). Najlepiej nie używać std::cin.sync(); w ogóle. |
|
matex44 Temat założony przez niniejszego użytkownika |
» 2014-09-17 15:59:55 To by się zgadzalo bo akurat pracuje na Mac OS X. Czy mogę prosic o wyjasnienie co robi podany przez Ciebie kod?
Dziekuje za pomoc, pozdrawiam |
|
Jacob99 |
» 2014-09-17 16:11:59 #include <iostream> #include <limits>
int main() { using namespace std; int liczba; cout << "Podaj liczbe: "; while( !( cin >> liczba ) ) { cin.clear(); cin.ignore( numeric_limits < streamsize >::max(), '\n' ); cout << "To nie liczba, podaj liczbe: "; } cout << "Podano " << liczba << endl; } std::numeric_limits<streamsize>::max() daje nam maksymalną ilość znaków, które może pomieścić strumień. |
|
matex44 Temat założony przez niniejszego użytkownika |
» 2014-09-17 18:35:06 Dziękuję za pomoc. Pozdrawiam |
|
« 1 » |