Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Process Returned -1073741819 (0xC0000005) przy tablicach i bibliotece fstream

Ostatnio zmodyfikowano 2016-12-09 20:40
Autor Wiadomość
pealike
Temat założony przez niniejszego użytkownika
[C++] Process Returned -1073741819 (0xC0000005) przy tablicach i bibliotece fstream
» 2016-12-09 19:08:37
Witam,
podczas kompilowania mojego kodu, którego zamieszczę poniżej, występuje błąd:
najpierw Windowsowy, który mówi "Program grarpg.exe przestał działać",
a potem w konsoli " Process Returned -1073741819 (0xC0000005) ".
Tworzę grę RPG dla uczenia się C++ i w momencie, gdy chcę
przerzucić wszystkie teksty menu głównego, wszystkich miejsc i opisów
do CPP, a robię to z pomocą biblioteki fstream. Każdy opis czy menu główne
posiada 4 linijki tekstu, więc stworzyłem stringi z tablicami. (spis,miejscelas,miejscemiasto,menu)
Dałem więc while'a, który robi pętle, gdy getline ma linijki do zbierania, a wiadomo, że gdy nie ma już
linijek, zatrzymuje się. W tej pętli zrobiłem inkrementację numerka linijki, który po każdej pętli
do danych zmiennych daje daną linijkę kodu. W ten sposób zrobiłem switcha, który właśnie jest tą każdą linijką
i dodaje linijki z .txt do zmiennych. W if'ie zrobiłem, że gdy już dobiegnie końca case 4, resetuje się while,
dodaje się nowa linijka. Nie wiem jak to wytłumaczyć, więc Ci bardziej zaawansowanie po prostu zrozumią.
Pytanie moje: Błędu tutaj żadnego nie ma, przynajmniej według mnie, a program i tak się wysypuje.

Kod źródłowy:
C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

string linia;
int nr_linii = 1;
string menu[ 4 ];
string miejscemiasto[ 4 ];
string miejscelas[ 4 ];
string spis[ 4 ];
int nrr = 0;
int wybor;

int main()

{
   
    fstream plik;
    plik.open( "gra.txt", ios::in ); // pliki gry
    if( plik.good() == false ) { cout << "Nie masz plikow gry!"; exit( 0 ); }
    while( getline( plik, linia ) )
    {
        switch( nr_linii )
        {
        case 1: menu[ nrr ] = linia; break;
        case 2: miejscelas[ nrr ] = linia; break;
        case 3: miejscemiasto[ nrr ] = linia; break;
        case 4: spis[ nrr ] = linia; break;
        }
        if( nr_linii == 4 ) { nr_linii = 1; nrr++; }
        nr_linii++;
    }
    plik.close(); // koniec z plikami gry, wczytane
   
    for( int i = 1; i <= 3; i++ )
    {
        cout << menu[ i ];
    }
    return 0;
   
}

A to są linijki tekstu, które chce mieć w każdej, pojedyńczej zmiennej:

GRA TEKSTOWA RPG
===============
1. Nowa gra
2. Wyjscie
Zloto:
Bron:
HP:
Imie:
1.Idz do lasu
2.Idz do sklepu
3.Idz na arene
4. Idz do straznika
1. Zabij zajaca (latwy)
2. Zabij wilka (sredni)
3. Zabij niedzwiedzia (trudny)
4. Do miasta



P-154693
Gibas11
» 2016-12-09 20:08:54
Debugger prawdę Ci powie, przeanalizuj sobie jakie wartości przybiera zmienna
nr_linii
 pamiętając jednocześnie o tablicach w C++, tj. indeksuje się je od zera a dla rozmiaru
n
, ostatni element ma indeks
n - 1
.
P-154696
karambaHZP
» 2016-12-09 20:09:27
C/C++
if( nr_linii == 4 ) { nr_linii = 1; nrr++; }
nr_linii++;
 Pewnie to jest błąd.
Powiększasz indeks tablicy do wczytania następnej porcji danych do tablic,
a następnie
nr_linii++;
 powiększasz o jeden, czyli startujesz od drugiego
case
a.

edit:
Zmienne globalne "fuj".
Poczytaj o
struct
. Ułatwi ci życie.
P-154697
pealike
Temat założony przez niniejszego użytkownika
» 2016-12-09 20:40:49
Dzięki wszystkim za odpowiedź.
Jakby co, jestem początkujący i mało funkcji znam, ale dzięki za poradę karambaHZP.
Udalo się. Wszystko teraz działa jak należy.
P-154699
« 1 »
  Strona 1 z 1