po deklaracja zmiennej w try{} zmiennej nie widać poza try{}

Odpowiedz Nowy wątek
2016-08-22 14:46

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

0

Witam mam dziwny problem wszystko działało do momentu wpisania obsługi wyjątków try{}.

 #include "my_file.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <stdexcept>

int main()
{
    my_file file( "dane.txt" );
    if ( file.is_file_opened() )
    {
        std::cerr << "Plik nie istnieje" << std::endl;
//        return 1;
    }
    if ( file.is_file_empty() )
    {
        std::cerr << "Plik jest pusty" << std::endl;
//        return 1;
    }
    try
    {
        double budget = std::stod( file.add_budget() );
    }
    catch ( std::invalid_argument)
    {
        std::cerr << "Dane w pliku nie są liczbami" << std::endl;
    }

    std::cout << "budrzet na starcie wynosi: " << std::setprecision(2) << budget << std::endl;
    return 0;
}

Bez try zmienna budget normalnie się wypisywała a po zastosowaniu try już nie chce. Nie wiem o co chodzi?

Łap zawsze wyjątki przez const referencję (chyba, że wiesz co robisz). - satirev 2016-08-22 21:50
wiesz co jest początkujący i nie wiem czy dobrze rozumiem chodzi ci np. o catch ( const& std::invalid_argument )? - 87kelthuzad 2016-08-22 21:56
tak, ale to const std::invalid_argument&amp; albo std::invalid_argument const&amp; - satirev 2016-08-22 22:01

Pozostało 580 znaków

2016-08-22 14:50

Rejestracja: 5 lat temu

Ostatnio: 1 miesiąc temu

2

Zmienna ma swój zasięg (scope), który zazwyczaj ogranicza się wewnątrz pary nawiasów klamrowych. Czyli po wyjściu z tych klamrek ta zmienna już nie istnieje. Szybkie rozwiązanie Twojego problemu:

double budget = 0;
try
{
    budget = ...
}

Jako ciekawostka spróbuj taki kod skompilkować

int main() 
{
    {
        int x = 5;
    }
    cout << x;
}
edytowany 2x, ostatnio: twonek, 2016-08-22 14:52
I UB przy cout &lt;&lt; budget. Rozwiązanie bez sensu. Patrz post niżej. - pingwindyktator 2016-08-22 14:51
edit: czyli jak w pliku jest zapisane "dupa" to budżet jest równy 0, tak? - pingwindyktator 2016-08-22 14:54
To już problem logiki programu, a nie konstrukcji językowej :D - twonek 2016-08-22 14:57
No to nie proponuj rozwiązań z problemami logicznymi. Błędem autora jest tutaj właśnie brak logiki a nie jakieś niezrozumienie scope obiektu. - pingwindyktator 2016-08-22 14:59
Żeby nie było, ja rozumiem to co mówisz. I już na samym początku zaznaczyłem, że nie jest to idealne rozwiązanie Szybkie rozwiązanie Twojego problemu. - twonek 2016-08-22 15:00
Ależ oczywiście że nie rozumie kwestii zasięgu obiektu. A jeśli już się uprzemy to potrafię sobie wyobrazić taką logikę, gdzie budżet ma pewną domyślną wartość gdy nie uda się odczytać z pliku. - twonek 2016-08-22 15:02

Pozostało 580 znaków

2016-08-22 14:51

Rejestracja: 7 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Kraków

1

Bo to co napisałeś nie ma sensu. Ile ma wynosić budżet po wprowadzeniu złej wartości do budget?


Pozostało 580 znaków

2016-08-22 14:51

Rejestracja: 6 lat temu

Ostatnio: 3 godziny temu

Lokalizacja: Kraków

1

Ponieważ zmienne deklarowane w bloku try mają zasięg tylko w tym bloku. Jak chcesz jej używać i w bloku i poza nim to musisz ją zadeklarować na zewnątrz try.

Pozostało 580 znaków

kq
2016-08-22 15:13
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Szczecin

3

Wszystko fajnie, ale jeśli wczytanie się nie powiedzie to użyj boost::optional w zewnętrznym scope aby oznaczyć zmienną bez wartości. Ewentualnie w przypadku double'a możesz użyć NaN


Pozostało 580 znaków

2016-08-22 15:41

Rejestracja: 3 lata temu

Ostatnio: 3 lata temu

Lokalizacja: Wrocław

2
{
    double budget = 0;
    try
    {
        budget = std::stod( file.add_budget() );
        std::cout << "budzet na starcie wynosi: " << std::setprecision(2) << budget << std::endl;
    }
    catch ( std::invalid_argument)
    {
        std::cerr << "Dane w pliku nie są liczbami" << std::endl;
    }
}

Nie łatwiej tak?

edytowany 2x, ostatnio: mlyszczek, 2016-08-22 15:42
W takim przypadku już nie trzeba zadeklarować (technicznie rzecz biorąc zdefiniować) budget przed try :D - twonek 2016-08-22 15:47
Zgadza się, chyba że chcemy wykorzystać budget poza try. Nie wiadomo do końca o co autorowi chodzi:) - mlyszczek 2016-08-22 15:48

Pozostało 580 znaków

2016-08-22 17:58

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

0
kq napisał(a):

Wszystko fajnie, ale jeśli wczytanie się nie powiedzie to użyj boost::optional w zewnętrznym scope aby oznaczyć zmienną bez wartości. Ewentualnie w przypadku double'a możesz użyć NaN

Kq czy chodziło ci o coś takiego en.cppreference.com/w/cpp/utility/optional

edytowany 1x, ostatnio: 87kelthuzad, 2016-08-22 17:58
kq
2016-08-22 17:59
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Szczecin

1

Nie, chodziło mi o Boost.Optional. std::optional jeszcze w standardzie nie ma.


Pozostało 580 znaków

2016-08-22 18:27

Rejestracja: 3 lata temu

Ostatnio: 1 rok temu

0

kq czy możesz mi podać jakąś stronę z opisem Boost.Optional bo wpisuje to w http://en.cppreference.com/ i w http://www.cplusplus.com/ i nie omeg znaleść

bo jest na stronie boost ;) - fasadin 2016-08-22 18:28

Pozostało 580 znaków

2016-08-22 18:28

Rejestracja: 8 lat temu

Ostatnio: 3 dni temu

2

http://www.boost.org/doc/libs[...]/optional/doc/html/index.html

jezeli jestes poczatkujacy to nie idz ta droga. Zapewne bedziesz miec ogromne problemy z kompilacja boosta (ja zawsze mialem...)

edytowany 1x, ostatnio: fasadin, 2016-08-22 18:29

Pozostało 580 znaków

kq
2016-08-22 18:29
kq
Moderator C/C++

Rejestracja: 6 lat temu

Ostatnio: 1 godzina temu

Lokalizacja: Szczecin

5

Nie ma potrzeby kompilacji boosta aby użyć optional


nawet nie wiedzialem ;) - fasadin 2016-08-22 18:30
to tylko nagłówki templatkowe - gośćabc 2016-08-22 18:57
Mimo wszystko brzmi jak Overkill - pylaochos 2016-08-29 12:45

Pozostało 580 znaków

Odpowiedz

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