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

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?

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;
}
1

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

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.

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

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?

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

1

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

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Źć

2

http://www.boost.org/doc/libs/1_61_0/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...)

5

Nie ma potrzeby kompilacji boosta aby użyć optional

0

no jestem nawet bardzo początkujący :D a co byś proponował bo dostałem jeszcze propozycje od kq by zastosować Nan. Czy o to ci chodziło czy jest jeszcze 3 rozwiązanie?

Sprawdzałem tego boost i mam pytanie dla początkującej osoby takiej jak ja nie lepiej jednak było by użyć NaN

0

Nie jestem pewien ale co by sie stalo gdyby uzyl slowa static

try{
static int variable;
}

Moge sie mylic.

2

variable miałoby statyczny czas życia.

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