Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

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
Autor Wiadomość
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
P-117097
Mateus.
» 2014-09-17 12:48:58
Kod?
P-117100
Monika90
» 2014-09-17 12:52:10
Czy jak zastapisz go takim, to działa?
C/C++
#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;
}
P-117101
matex44
Temat założony przez niniejszego użytkownika
» 2014-09-17 14:37:16
kod o który chodzi to:
C/C++
#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 :)
P-117103
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.
P-117105
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
P-117106
Jacob99
» 2014-09-17 16:11:59
C/C++
#include <iostream>
#include <limits>

int main()
{
    using namespace std;
    int liczba;
    cout << "Podaj liczbe: ";
    while( !( cin >> liczba ) ) //dopóki wczytany znak nie jest liczbą
    {
        cin.clear(); //czyscimy bledy strumienia
        cin.ignore( numeric_limits < streamsize >::max(), '\n' ); //ignorujemy wszystkie znaki ze strumienia, az do napotkania konca linii
        cout << "To nie liczba, podaj liczbe: ";
    }
   
    cout << "Podano " << liczba << endl; //jesli podano poprawna liczbe wypisujemy ja
}

std::numeric_limits<streamsize>::max() daje nam maksymalną ilość znaków, które może pomieścić strumień.
P-117108
matex44
Temat założony przez niniejszego użytkownika
» 2014-09-17 18:35:06
Dziękuję za pomoc. Pozdrawiam
P-117113
« 1 »
  Strona 1 z 1