Cin do zmiennej [obsługa błędów (wyjątków) C++]

Odpowiedz Nowy wątek
2011-07-16 20:55
0

Witajcie! Potrzebuję pomocy odnośnie obsługi błędów w C++. W założeniach ten program ma wczytywać jakąś liczbę i pisać "Wszystko OK" jeżeli się to powiedzie. Jeśli się nie powiedzie, wypisuje "Błąd: ", a następnie wartość która jest błędna (tak wiem, że powinien też wypisywać jaka zmienna jest zła, bla bla bla, ale tutaj akurat chodzi mi tylko o to, że nie mogę tego wczytać...). My chcemy, żeby wartości były niepoprawne, ponieważ musimy przetestować obsługę błędów :P. Problem polega na tym, że gdy program znajdzie błąd '(!cin)' ładnie daje to runtime_error'a. Niestety, nie może przekazać tego, co wpisaliśmy do strumienia do zmiennej, żeby to potem wyświetlić (albo tak się dzieje, a ja używam po prostu źle jakiś funkcji :S). Mój kod wygląda tak:

#include <std_lib_facilities.h>
#include <conio.h>
 
void error(string s1)
{
    throw runtime_error(s1);
}
 
int main()
try{
    system("chcp 1250");
 
    cout << ":> ";
 
    string s1;
    double d = 0;
    cin >> d;
    if (!cin)
    {
        istream& get (string& s1); error(s1);
    }
    else cout << "Wszystko OK!";
    _getch();
    return 0;
}
 
catch (runtime_error& e)
{
    cerr << "Błąd: " << e.what();
    _getch();
    return 1;
}
 
catch (...)
{
    cerr << "Niespodziewany błąd!";
    _getch();
    return 2;
}

PS: std_lib_facilities.h to jest plik nagłówkowy, który zawiera w sobie większość "standardowych" (takich jak chociażby wszystkie stream'y) plików nagłówkowych.

EDIT: Nie działa wczytywanie strumienia do zmiennej. Byłem idiotą, że nie sprawdziłem od razu co zawiodło. Sory :P
EDIT2: Co nie znaczy, że wiem, jak dać cin'a do zmiennej (w tym przypadku).


"Na imię mi Legion, bo nas jest wielu." - Mk 5, 9
edytowany 3x, ostatnio: kapi12c, 2011-07-16 22:07

Pozostało 580 znaków

2011-07-16 23:04
2

istream& get (string& s1)
Wiesz co to robi? Nic, to jest deklaracja funkcji get przyjmującej referencję do string i zwracająca referencję do istream, a chyba nie o to Ci tu chodziło.

Za bardzo mi nie pomogłeś. Wciąż nie wiem jak to zrobić, aby działało tak jak chcę. - kapi12c 2011-07-17 09:45

Pozostało 580 znaków

2011-07-17 11:32
2

Wczytanie tylko i wyłącznie liczby przy pomocy cin wygląda tak:

int i = 0;
while(!(std::cin >> i))
{
    std::cin.clear();
    std::string str;
    std::getline(str); // co do tego nie jestem pewien czy zadziała.
    std::cout << "Podaj liczbę, a nie " << str;
}
edytowany 1x, ostatnio: hauleth, 2011-07-17 11:35
"Jeśli się nie powiedzie, wypisuje "Błąd: ", a następnie wartość która jest błędna (...). My chcemy, żeby wartości były niepoprawne, ponieważ musimy przetestować obsługę błędów.", "Niestety, nie może przekazać tego, co wpisaliśmy do strumienia do zmiennej, żeby to potem wyświetlić(...)" - Uczymy się czytać posty! :) - kapi12c 2011-07-17 19:15
Ja proponuję w takim razie c++ się pouczyć ;p Kurde sezon ogórkowy, a zarozumialce jak w sesji się tutaj zlatują ... - lukas_gab 2011-07-18 08:39
Ja właśnie uczę się C++, ale napotkałem pewien problem, więc proszę kolegów po fachu o pomoc :). - kapi12c 2011-07-18 09:09
@kapi12c mam pytanie, dlaczego ludzie nie myślą? Żeby się pojawiało "Błąd: <wartość która jest błędna>" w tym kodzie wystarczy zmienić jeden napis, który nawet widać. Żeby dodać wyjątki to chyba też nie był by teraz problem. Więc jak się uczysz to czemu nie myślisz... - hauleth 2011-07-18 11:31

Pozostało 580 znaków

2011-07-18 13:02
0

@winefresh

Mógłbyś napisać jaki konkretnie napis? Byłbym bardzo wdzięczny :).

Nie chcę się tutaj wymądzrzać, ale jeżeli do int damy string, to [zmienna] int (w naszym wypadku 'd') będzie miała wartość "losową", nie wiem jak to się zwie, w każdym razie "dziwną". Dlatego pytam się jak zrobić to tak, żeby działało (czyli wyciągnąć to co wpisaliśmy i przypisać do zmiennej).

Jestem początkującym programistą, więc nie oczekuj ode mnie, że będę wiedział wszystko. Co do myślenia - pomyślałem. Użyłem istream& get ( string& s1 ), ponieważ znalazłem definicję 'istream& get ( char& c )' - "Extracts a character from the stream and stores it in c.", a więc "wyjmuje znak ze strumienia i przypisuje (umieszcza) w 'c' ". Skoro działa z char'em to pomyślałem, że ze stringiem też powinno zadziałać. Zamieniłem istream& get ( char& c )</code> na <code>istream& get ( string& s1 ), ponieważ skoro "wyjmuje" ze strumienia i przechowuje, to powinno zadziałać. Niestety nie działa. Domyśliłem się, że może jednak ta funkcja ma inne zastosowanie, a że nie znalazłem nic innego to napisałem tutaj. Próbowałem też jednocześnie przesłać wpisane znaki do 2 zmiennych (int i string), ale się nie udało. Nie da się zrobić konwersji string na int, więc kolejny sposób do kosza. Przypomniało mi się coś, co się zwało "zapis wartości", przekazanie wartości. Jak zwał tak zwał. Za pomocą operatora << czy >> (próbowałem oba) przekazujemy wartość... Czy jakoś tak, akurat gdzieś tylko zauważyłem, że coś takiego jest, więc spróbowałem :S. Więc nie pisz proszę, że nie myślę, bo używam mózgu. Ogranicza mnie jak na razie tylko poziom wiedzy, gdyż dopiero się uczę :].


"Na imię mi Legion, bo nas jest wielu." - Mk 5, 9

Pozostało 580 znaków

2011-07-19 19:48
1

Osztyzłyiniedobry. Zacznij od nauki wywoływania funkcji, a nie od wyjątków i obsługi błędów przy pomocy strumieni. Uczymy się od prostych rzeczy do trudniejszych, a nie na odwrót!

Umiem wywoływać funkcje... To jest chyba podstawa... Spójrz chociażby na 'error(s1);'... Odnośnie uczenia się najpierw prostych, potem trudnych - korzystam z książki i tak są poukładane tematy, więc nic nie poradzę na to, że coś jest "trudne" (choć dla mnie nie jest - po prostu nie znam funkcji, która by wczytała do ładnie do zmiennej :) [albo czegoś nie zauważyłem/nie pomyślałem i jestem idiotą :F] ). - kapi12c 2011-07-19 20:01
skoro nie odróżniasz tego: istream& get ( string& s1 ) od wywołania funkcji to jednak nie umiesz wywoływać funkcji. - byku_guzio 2011-07-19 20:20
To jest chyba przekazanie przez referencję, tak? :P Ludzie, zrozumcie, że jestem początkującym programistą, więc tak, nie wiem wszystkiego. Zamiast kłócić się odnośnie mojej wiedzy może ktoś by po prostu "pokazał" mi jak to zrobić? - kapi12c 2011-07-20 09:56

Pozostało 580 znaków

2011-07-20 10:33
kapi12c napisał(a)

To jest chyba przekazanie przez referencję, tak? :P Ludzie, zrozumcie, że jestem początkującym programistą, więc tak, nie wiem wszystkiego. Zamiast kłócić się odnośnie mojej wiedzy może ktoś by po prostu "pokazał" mi jak to zrobić?

No przecież wszystko już zostało powiedziane, ale masz jeszcze dokładniej.
1)rzucasz wyjątek
2)łapiesz wyjątek
3)kasujesz flagi błędów strumienia (metoda clear)
4)pobierasz to co siedzi w strumieniu do jakiegoś stringa
5)wypisujesz tego stringa na wyjście

Ale do zabawy z wyjątkami wypadałoby chociaż wiedzieć co to są klasy, obiekty, dziedziczenie, a Ty nie rozróżniasz wywołania funkcji od jej deklaracji(odpowiedź na pytanie: NIE to nie jest przekazanie przez referencję, to jest zwykła deklaracja funkcji).


Dziękuję. :) Tylko jak właśnie pobrać to co siedzi w strumieniu do stringa? - kapi12c 2011-07-20 12:12
Boże widzisz i nie grzmisz... dlaczego ludzie zabierają się za bardziej zaawansowane tematy nie mając żadnych podstaw? string bleble; cin >> bleble; - byku_guzio 2011-07-20 12:13
winterfresh to napisał... - byku_guzio 2011-07-20 12:14
Ok, działa. Dziękuję wszystkim za pomoc :D. (Nie wiedziałem że "cin >>" może też wyciągnąć znaki ze strumienia. Myślałem, że tylko otwiera strumień [umożliwia wpisywanie znaków] ). Jeszcze raz dziękuję i przepraszam, że zawracałem dupę z powodu swojej niewiedzy. :S - kapi12c 2011-07-20 12:38
cin jest obiektem klasy istream reprezentującym strumień ze standardowego wejścia do programu - byku_guzio 2011-07-20 12:57

Pozostało 580 znaków

2011-07-20 10:44
0

Ludzie, zrozumcie, że jestem początkującym programistą, więc tak, nie wiem wszystkiego.

Rozumiemy, ale nikt tutaj podstaw nie będzie wykładać. Piszesz, że uczysz się z książką. Do lektury jednak się dobrze nie przyłożyłeś.

edytowany 1x, ostatnio: Sarrus, 2011-07-20 10:44

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0