C++ i błędy po skompilowaniu


(Sebek222) #1

Witam, podczas kompilacji niektórych kodów napsianych przeze mnie nie ma żadnych błędów, jednak jak uruchamiam aplikację na komputerze to wyskakuje raport o błędach systemu windows. Wie ktoś może o co chodzi ? A m. in. wyskakuje mi przy przypisaniu zmiennej rozmiaru wektora czyli np. mam:

vector costam;

int i=costam.size();

Wlasnie po dodaniu mniej wiecej takiego kodu wyskakuje mi pozniej raportowanie o błędach (a kompilator nie wykrywa błędów - używam Dev CPP).

I nie chodzi mi tutaj o jakieś inne rozwiązanie bo miałem jeszcze kiedyś niewyjaśnione błędy. Poprostu mam pytanie czemu tak sie dzieje, przecież operator size() zwraca wartość całkowitą więc przypisanie jej do zmiennej typu int nie powinno sprawiać problemu...

Pozdrawiam, User01.


(Sawyer47) #2

Po tych dwóch linijkach niewiele można powiedzieć, są poprawne. Pokaż cały kod to wtedy będzie można powiedzieć coś więcej.

edit: size() zwraca std::size_t, teoretycznie wartość może być większa od int. Tylko wątpię aby w wektorze było ponad 2 miliardy elementów.


(Gryph) #3

A moze chodzi o to, ze odwolujesz sie do obiektu, ktory nie zostal zainicjowany? Tutaj widze tylko deklaracje.

Sprobuj przypisac obiektowi "costam" jakas wartosc i sprawdz jeszcze raz.


(Sebek222) #4

Dobra skopiuje wam cały kod, napisałem urywek bo wyczułem że przez tą linijke sie psuło.

#include 

#include 

#include 

#include 

using namespace std;

int main()

{

    string a,c;

    vector b;

    ifstream in("text.txt");

    while(getline(in,a))

    {


           for (int i=b.size();i>=0;i--)

           cout<
    }

return 0;

}[/code]

Oczywiście plik tekstowy znajduje się we wskazanej ścieżce.


(Gryph) #5

Ja sie nadal bede czepial tej inicjalizacji - daj znac czy to pomoglo (oczywiscie wektor b).


(Sawyer47) #6

No nie dziwię się, że ten kod się wywala, jest totalne bez sensu i błędny. Wywala się bo odnosisz się do wektora "b" w którym nic nie ma. Resztę kodu przemilczę...


(Sebek222) #7

Nie rozumiem o jaką inicjalizację chodzi, jak np. zrobie tak:

vector b=0;

to kompilator zwraca błąd. Sory, musiałe mna nowo pisac ten kod i zapomniałem czegoś dodać, teraz daje już kompletny, bo faktycznie wektor nic nie zawierał wyżej :stuck_out_tongue:

#include 

#include 

#include 

#include 

using namespace std;

int main()

{

    string a,c;

    vector b;

    ifstream in("text.txt");

    while(getline(in,a))

    {

           b.push_back(a);

           for (int i=b.size();i>=0;i--)

           cout<
    }

return 0;

}

[/code]

(Gryph) #8

a tak:

b.push_back("");

?

Kompilator łyka taka inicjalizacje wektora?


(Sebek222) #9

Kompilator łyka, ale znów wywala błąd, i to jeszcze jakieś dźwięki dają się we znaki, no ale z tym push_back już dodałem, bo zapomniałem tego napisać, wyżej jest mój poprawiony kod. No i nadal moje pytanie brzmi czemu to jest błędne, skoro kompilator nie zwraca błędu ?


(Gryph) #10

zamiast:

cout<

Sprobuj tak:

[code]std::string s = b.at(i);


(Sebek222) #11

Niestety nie... kompilator zglosił błąd a jak zmieniłem na cout<

Gryphoon innych sposobów i tak nie rozumiem, chce tylko wiedzieć czemu nie idzie przypisywać tych danych size(), bo jak robiłem w odwrotną stronę (chciałem wyświetlić wektor z inkrementacją od i=0 do size() to było wszystko ok, tylko jak już dekrementuje i zaczynam od i=b.size() to wywala ten błąd i właśnie tylko to mnie zastanawia czemu tak jest... Czy to jest błędny kod ?


(Gryph) #12

Stary - wychodzisz w pierwszym kroku poza wektor.

Jesli np. wektor ma 3 elementy to size() zwroci 3, ale ostatni element bedzie mial indeks rowny 2.

Popraw po prostu te petle for, np tak:

for (int i=b.size()-1;i>=0;i--)

(Sebek222) #13

Teraz nie wyskakuje żaden błąd ale działa nie tak jak chciałem, wczytuje od poczatku wektor a nie od końca i jeszcze po kilka razy... Ale dobra dzięki za pomoc, nie do końca rozumiem jak działają te wektory, skoro wczytuje za pomocą push_back() linie z pliku np. o takiej zawartości:

linia 1

linia 2

linia 3

To np. b[0] zawierac bedzie "linia 1" itd... tak ? to nie rozumiem jak wychodze poza wektor, ale dobra jak nie chce ci sie tłumaczyć to się nie męcz, dzięki za pomoc.


(Gryph) #14

Rozpisz to sobie na kartce, co sie dzieje z wektorem przy kazdym przebiegu petli while.

Masz blad w kodzie - nie obrazaj sie tylko popracuj glowa.

Podpowiedź: nie zerujesz wektora b na poczatku kazdego korku petli while - stad te kilka razy.


(Sebek222) #15

Nie wiem co mam rozpisać...

Na moje to wygląda tak:

tworze wektor, i za kazdym razem wczytuje do niego nowy wers, więc tworzy się nowa "tablica", nie wiem o jakim zerowaniu piszesz, może ja o czymś nie wiem ale myśle sobie że przecież za każdym razem wektor dodaje nowe miejsce więc jak bym miał go nawet zerować (chociaż nie wiem jak to sie robi) to znów by te "tablice" sie powtarzały... Czyli jak to ma wyglądać ? Wczyta sie coś np. do b[0] i zaraz jak wyzeruje to znów będzie wczytywało tekst w to samo miejsce ? czyli po raz drugi będzie coś wczytywane do b[0] ?


(Gryph) #16

Ok, łopatologicznie:

while(getline(in,a)) //tu bierzesz linia po linii z pliku i wstawiasz do a

    {

           b.push_back(a); //tu DODAJESZ a do kolekcji b

           for (int i=b.size();i>=0;i--)

           cout<
    }

[/code]




Efekt? Jesli plik zawiera cos takiego:

[code]Linia 1 Linia 2 Linia 3 Linia 4

.. to wynik bedzie taki:

Linia 1Linia 2Linia 1Linia 3Linia 2Linia 1Linia 4Linia 3Linia 2Linia 1

Zgadza sie? Pisze na sucho - kompiluje w glowie :wink:


(Sebek222) #17

Już wiem o co chodzi z tym wczytywaniem, dałem pętlę for za pętlą while i jest ok twoim sposobem:

for (int i=b.size()-1;i>=0;i--)

Tylko nie rozumiem dlaczego tak jest poprostu. Bo przecież incijalizacja i następuje tylko raz, jest jej przypisywana wartość początkowa o tyle, a w dalszej części pętli jest ta wartość inkrementowana... to dlaczego jednak z tym "-1" działa ?

(Gryph) #18

Jak juz pisalem pare postow wyzej - wyskakujesz poza wektor. Jeden z najpopularniejszych bledow, jakie sie spotyka w programach pisanych w C/C++ - indeksowanie poza tablice.

Dorzuc do kodu linie, aby Ci wyrzucil na ekran wartosci "i" oraz "b.size()" w kazdym kroku - zobaczysz.

Pozdrowienia


(Sebek222) #19

AAAAAA !!