• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Ciągłe crashe

VPS Starter Arubacloud
0 głosów
147 wizyt
pytanie zadane 16 stycznia 2017 w C i C++ przez Darven Użytkownik (860 p.)
Witam.

 

Uczę się C++ i mam problem z ciągłymi crashami w code:block, być może jest to efekt kodu który mi po prostu crasuje program.

 

Pierwszy, bardzo prosty. Utworzenie zmiennej wskaźnikowej i przypisanie jej wartości. Program natychmiast się wysypuje http://www.wklej.org/id/3017455/

 

Oraz program z którym walczę już od dłuższego czasu. Wczytuje on z pliku pewne dane linia po lini i przxypisuje je zmiennym w tablicy. http://www.wklej.org/id/3017458/

Problem jest taki, że jak numer posiada znowu wartość jeden, to wczytywanie z linii także się resetuje. Wygląda to tak, jakby numer cofał funkcje getline(). Tak czy inaczej, po ciągłych modyfikacjach, program także zaczął się crashować.Odchudziłęm go do niezbędnego minimum, by znaleźć problem....i nie znalazłem. Ja już nie wiem czy tylko mi się to crasuje czy coś tu zepsułem.

1 odpowiedź

+1 głos
odpowiedź 16 stycznia 2017 przez Pajdas Mądrala (5,930 p.)
wybrane 16 stycznia 2017 przez Darven
 
Najlepsza

To, że program który podesłałeś wywala jest normalną rzeczą.

Wskaźnik, jest to adres na jakąś zmienną.

Jeżeli tworzysz adres to tak jakbyś stworzyła kuriera. Przypisując wartość 5 do *a to tak jakby nazwać kuriera piątką.
Kurier może wysłać piątkę do jakiejś zmiennej, ale sam nie może być piątką.

Rozwiązaniem twojego problemu jest:

#include <iostream>

using namespace std;

int main()
{
    int zmienna;                //tworzę zmienną która będzie miała określony adres (numer domu).
    int *kurier = &zmienna;     //tworzę kuriera i wskazuję mu adres (&) zmiennej (andes domu).
    *kurier = 5;                //Teraz przypisuję wartość nie do kuriera, ale do domu na który wskazuje, czyli w tym przypadku zmienna.

    //Poniższa linijka jest nieprawidłowa, aby skompilować program musisz ją usunąć.
    kurier = 5;                 //To jest przypisanie wartości kurierowi (wskaźnikowi) ale nie jest prawidłowe i nie działa, ponieważ występuje
                                //tutaj niezgodność typów. Liczba 5 jest int'em, a wskaźnik pomimo tego, że jest przedstawiony za pomocą liczb
                                //jest innym typem niż int, jest typem wskaźnikowym.
    cout<<"dom: "<<zmienna<<endl;
    cout<<"numer domu: "<<&zmienna<<endl;
    cout<<"adres jaki posiada kurier: "<<kurier<<endl;
    cout<<"wartość na którą wskazuje kurier: "<<*kurier<<endl;
    return 0;
}

Mam nadzieję, że już wszystko jest dla ciebie zrozumiałe. Wskaźniki to trudny temat i trzeba z nim trochę popracować.
Dokładnie przeczytaj komentarze które tam napisałem

Poćwicz jeszcze odczyt z pliku.
Bez pliku, program mi działa.
Nie wiem co ty masz w typ pliku u siebie i ile masz tam linijek.

#include <iostream>
#include <fstream>

using namespace std;

string imie[3], telefon[3], miasto[3];

int main()
{
    string linia;
    int numer = 1;
    int liczba = 1;

    fstream plik;
    plik.open("test.txt", ios::in);

    if(!plik.is_open())
    {
        cout << "nie odnaleziono pliku" << endl;
        return 1;
    }
    for(int i=0;plik.good(); i++)
    {
        getline(plik, linia);
        imie[i] = linia;
        getline(plik, linia);
        telefon[i] = linia;
        getline(plik, linia);
        miasto[i] = linia;
    }
    for(int i=0; i<3; i++)
    {
        cout<<"imie[i]: "<<imie[i]<<endl;
        cout<<"telefon[i]: "<<telefon[i]<<endl;
        cout<<"miasto[i]: "<<miasto[i]<<endl;
    }
    plik.close();
    return 0;
}

Program nie jest doskonały, bo działa prawidłowo tylko wtedy kiedy jest odpowiednia liczba linijek w pliku *.txt ale rozwiązanie tego problemu pozostawiam tobie.
Code::Blocks nie jest tu niczemu winny a twoje crashe są wynikiem błędnego podejścia do pisania programu i wąskiego zakresu wiedzy.

Odchudziłęm go do niezbędnego minimum, by znaleźć problem....i nie znalazłem

Od początku pisz program który nie będzie zawierać niepotrzebnych elementów.
Nie utrudniaj sobie życia, pisz jak najprościej się da
Ten switch to jest porażka, po co ci sprawdzać jaki wynik ma numer kiedy można zrobić łatwą, elegancja pętlę.
Poza tym zamiast tworzyć trzy tablice można stworzyć strukturę, która będzie zawierać po każdym z tych elementów i takich struktur stworzyć trzy.
 

komentarz 16 stycznia 2017 przez Darven Użytkownik (860 p.)
Ja wiem że ten kod nie jest doskonały, chciałem przećwiczyć funkcje switch, dlatego próbowałem stworzyć jakiś działający program z jego użyciem.

Nie rozumiem natomiast czemu program ci działał, mi normalnie wyskakuje info z ifa że pliku nie znaleziono.

Natomiast z plikiem program mi się crashuje., z twoim też i rozumiem, że powodem jest brak informacji o liczbie linijek w pliku?

 

Co do wskaźników, to dopiero się ich dotknąłem i mam pewne problemy z ich zrozumieniem. Trochę mi jednak rozjaśniłeś sprawę. Będę musiał sobie jednak poćwiczyć :D
komentarz 16 stycznia 2017 przez Pajdas Mądrala (5,930 p.)

Nie rozumiem natomiast czemu program ci działał, mi normalnie wyskakuje info z ifa że pliku nie znaleziono.

Różnica między moim programem i twoim to głównie użycie if(!plik.good()); zamiast działającego if(!plik.is_open()); oraz użycie while(getline(plik, linia)) zamiast for(int i=0;plik.good(); i++)

Nie wiem dokładnie jak działają te funkcje, bo nie wczytywałem się tak w dokumentacje, ale wyuczyłem się tego schematu, który jest prawidłowy. (to nie jest tak że wkuwam funkcje biblioteczne smiley, po prostu nie znam szczegółów działania tej funkcji)

P.S. Bardzo dziękuję za ocenę mojej odpowiedzi, jeżeli chciałbyś uzyskać jakieś informację na temat powyższego programu lub wskaźników to możesz pisać na priv, postaram się pomóc

komentarz 17 stycznia 2017 przez Darven Użytkownik (860 p.)
Tylko że mój if działą na moim kompie :D Sam nie wiem czemu tak się dzieje. W ogóle "plik.good" to funkcja z kursu, nie słyszałem wcześniej o "is_open".

Podobne pytania

0 głosów
3 odpowiedzi 439 wizyt
pytanie zadane 21 października 2018 w Systemy operacyjne, programy przez Frafro122 Nowicjusz (160 p.)
0 głosów
2 odpowiedzi 534 wizyt
pytanie zadane 10 marca 2018 w HTML i CSS przez PROFF Obywatel (1,180 p.)
0 głosów
1 odpowiedź 1,314 wizyt
pytanie zadane 5 lutego 2017 w C i C++ przez Andruh Początkujący (390 p.)

92,454 zapytań

141,262 odpowiedzi

319,099 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...