Run-Time Check Failure#3 - Zmienna użyta bez inicjalizacji?

0

Cześć!

Od kilku godzin próbuję poradzić sobie z tym problemem i już niebardzo wiem jak go ugryźć...

Program się kompiluje bez błędów, lecz podczas wczytywania wyskakuje coś takiego:

Run-Time Check Failure #3 - The variable 'pages' is being used without being initialized.
Run-Time Check Failure #3 - The variable 'edition' is being used without being initialized.
Run-Time Check Failure #3 - The variable 'year' is being used without being initialized.

Gdy wszystkie inty zamieniam na liczby plik nie wczytuje się poprawnie, ale błędy nie wyskakują.

Debugger wysypuje błąd na

	Book tmp(author, title, year, edition, publisher, pages, description);

title

Troche lepsza jakość:

W tym kodzie:
https://4programmers.net/Pastebin/6949

2

Cześć,
Błędów w trakcie kompilacji nie masz, ale ostrzeżenia?
Błąd jaki otrzymujesz:

Run-Time Check Failure #3 - The variable 'pages' is being used without being initialized.

Oznacza, że zmienna pages nie jest zainicjowana wartością początkową. W tym przypadku, najprawdopodobniej próbujesz wrzucić do konstruktora tmp zmienne mające wartości nieokreślone. Będą to śmieci z pamięci lub zera. Prowadzi to do wielu złych sytuacji, dlatego lepiej nie ignorować ostrzeżeń kompilatora ;)
Tworząc zmienną przypisz jej wartość początkową (na przykład zero, jeśli nie masz jakiejś konkretnej ;) )

2
string author; string title; unsigned int year; unsigned int edition; string publisher; unsigned int pages; string description;

Istnieją wewnątrz pętli while. Co oznacza, że są to inne zmienne za każdym obiegiem pętli. Przesuń je na zewnątrz.

0
Bartosz36 napisał(a):

Cześć,
Błędów w trakcie kompilacji nie masz, ale ostrzeżenia?
Błąd jaki otrzymujesz:

Run-Time Check Failure #3 - The variable 'pages' is being used without being initialized.

Oznacza, że zmienna pages nie jest zainicjowana wartością początkową. W tym przypadku, najprawdopodobniej próbujesz wrzucić do konstruktora tmp zmienne mające wartości nieokreślone. Będą to śmieci z pamięci lub zera. Prowadzi to do wielu złych sytuacji, dlatego lepiej nie ignorować ostrzeżeń kompilatora ;)
Tworząc zmienną przypisz jej wartość początkową (na przykład zero, jeśli nie masz jakiejś konkretnej ;) )

Dzięki za ostrzeżenie, będę o tym pamiętać!

string author; string title; unsigned int year; unsigned int edition; string publisher; unsigned int pages; string description;

> Istnieją wewnątrz pętli while. Co oznacza, że są to inne zmienne za każdym obiegiem pętli. Przesuń je na zewnątrz.

Wyrzuciłem przed pętlę jak zaproponowałeś i wszystko gra i buczy. Dzięki za pomoc!
4

Z tym switch strasznie sobie życie utrudniłeś.
Nie prościej tak:

std::istream& operator<<(std::istream &f, Book &book)
{
    // można to zrobić ładniej, ale brak danych o twoim kodzie.
    string author;
    string title;
    unsigned int year; 
    unsigned int edition;
    string publisher;
    unsigned int pages;
    string description;

    getline(f, author);
    getline(f, title) >> line >> edition >> std::ws;
    getline(f, publisher) >> pages >> std::ws;
    if (getline(f, description)) {
        book = Book { author, title, year, edition, publisher, pages, description }; 
    }
    return f;
}

void Library::load() {
    fstream file;
    file.open("library.txt", ios::in);
    if (file.good()) {
        load(file);
    } else {
        cout << "Plik nie istnieje!";
        exit(0); // IMO to jest nieco przesada
    }
}

void Library::load(std::istream &file) {
    Book tmp;
    while (file >> tmp) {
        books.push_back(tmp);
    }
}

offtopic: koduj tylko po angielsku, mieszanka polski angielski blado wygląda.

0
MarekR22 napisał(a):

Z tym switch strasznie sobie życie utrudniłeś.
Nie prościej tak:

std::istream& operator<<(std::istream &f, Book &book)
{
    // można to zrobić ładniej, ale brak danych o twoim kodzie.
    string author;
    string title;
    unsigned int year; 
    unsigned int edition;
    string publisher;
    unsigned int pages;
    string description;

    getline(f, author);
    getline(f, title) >> line >> edition >> std::ws;
    getline(f, publisher) >> pages >> std::ws;
    if (getline(f, description)) {
        book = Book { author, title, year, edition, publisher, pages, description }; 
    }
    return f;
}

void Library::load() {
    fstream file;
    file.open("library.txt", ios::in);
    if (file.good()) {
        load(file);
    } else {
        cout << "Plik nie istnieje!";
        exit(0); // IMO to jest nieco przesada
    }
}

void Library::load(std::istream &file) {
    Book tmp;
    while (file >> tmp) {
        books.push_back(tmp);
    }
}

offtopic: koduj tylko po angielsku, mieszanka polski angielski blado wygląda.

Dzięki, jak będę miał chwilkę to spróbuję zaimplementować w ten sposób
Tylko czy to zatrybi w taki sposób że po 7 linijce w .txt zacznie wczytywać od początku kolejną książkę.

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