Dziwny błąd - Process returned 3 (0x3)

0

Witam! Jestem początkujący jeśli chodzi o c++ więc proszę o wyrozumiałość. Piszę sobie program, który ma za zadanie wyciąganie pewnych informacji z pliku, zapisanego w formie tabelki wg. schematu. Niestety! jego kompilacja przebiega bez errorów i waringów, ale od razu po uruchomieniu program "przestaje działać" i zwraca kod 3. Nie mam pojęcia co to znaczy i czym jest to spowodowane?

#include <iostream>
#include <fstream>
#include <string>
#include <conio.h>
#include <stdlib.h>

using namespace std;

//Deklaracje funkcji:

void wczytajdane(string * nprzed, string * npo, int * wprzed, int * wpo, int gracze);
void zapiszwynik(string * nprzed, string * npo, int * wprzed, int * wpo, int gracze);
bool isNumeric(string str);

// Zmienne globalne:
fstream dane;
fstream wyniki;
string dziedzina = NULL;

int main()
{
   string temp;
   cout << "Witaj w programie RuneScapeWars! \nPodaj koñcówkê nazwy pliku z danymi:" << endl;
   cout << "Przyklad: Dane-04-11-18:00-19:00.txt" << endl;
   cout << "Dane-";
   cin >> temp;
   string nazwapliku = "Dane-" + temp;
   // PODMIENIÆ NA:
   // dane.open(nazwapliku, std::ios::in);
   dane.open("schemat.txt", std::ios::in);
   if (!dane.good())
    {
                 cout << "Nie znaleziono pliku o nazwie " << nazwapliku << "!!!";
                 getch();
                 return 0;
    }
    int iloscgraczy;
    dane >> iloscgraczy;

    string nazwyprzed[iloscgraczy];
    string nazwypo[iloscgraczy];
    int wartosciprzed[iloscgraczy];
    int wartoscipo[iloscgraczy];

    wczytajdane(nazwyprzed, nazwypo, wartosciprzed, wartoscipo, iloscgraczy);

    dane.close();
    cout << "Program zakonczyl dzialanie.";
    getch();
}

void wczytajdane(string * nprzed, string * npo, int * wprzed, int * wpo, int gracze)
{
    string linia;
    char chr[256];
    dane.getline(chr, 256);
    linia = chr;
    if (linia == "%END")
    {
        cout << "Osiagnieto koniec pliku." << endl;
        return;
    }
    if (linia.substr(0, 1) == "#")
    {
        dziedzina = linia.substr(1, linia.length() - 1);
    }
    else
    {
        dane.getline(chr, 256);
     linia = chr;
        wczytajdane(nprzed, npo, wprzed, wpo, gracze);
        return;
    }
    // START ORYGINA£
    dane.getline(chr, 256);
     linia = chr;
    if (linia.substr(0, 1) != "@")
    {
        cout << "BLAD DZIALANIA PROGRAMU!! OCZEKIWANO ZNAKU @!!!" << endl;
        getch();
        return;
    }
    for(int i = 0; i < gracze - 1; i++)
    {
        dane.getline(chr, 256);
     linia = chr;
        while(linia.find(","))
        {
            linia.erase(linia.find(","), 1);
        }
        int j2 = 0;
        int jj = 0;
        for(int j = 0; j < linia.length() - 1; j++)
        {
            if (linia.substr(j, 1) == " ")
            {
                if(!isNumeric(linia.substr(j2, j - j2)))
                {
                    if(nprzed[i] == "")
                    {
                        nprzed[i] += " ";
                        nprzed[i] += linia.substr(j2, j - j2);
                    }
                    else
                    {
                        nprzed[i] = linia.substr(j2, j - j2);
                    }
                }
                j2 = j;
            }
            jj = j;
        }
        if(isNumeric(linia.substr(j2, linia.length() - j2)))
        {
            wprzed[i] = strtol(linia.substr(j2, linia.length() - j2).c_str(), NULL, 10);
        }
        else
        {
            cout << "BLAD DZIALANIA PROGRAMU!! OCZEKIWANO LICZBY!!!" << endl;
            getch();
            return;
        }
        // KONIEC ORYGINA£U
    }
}

bool isNumeric(string str)
{
 for (int i=0; i < str.length() - 1; i++)
 {
   if( str[i]>15 && str[i]<26)
    {
    }
    else
    {
      return false;
    }
  }
  return true;
}
0

Napisz co wyświetla program (tylko nie mów że "konsola od razu znika" czy coś, jak tak to odpal go z linii poleceń), spróbuj użyć debuggera. Ewentualnie spróbuj robić checkpointy - tj. w pewnych miejscach w kodzie np. funkcji main wypisz daj wypisywanie jakiegoś napisu. Między ostatnim takim napisem który się wyświetli, a pierwszym który się nie wyświetli następuje crash - wtedy można powtórzyć szukanie w ograniczonym zakresie podejrzanych i tak do znalezienia błędu.

Tak, mógłbym dać gotowca, ale IMHO lepiej dać komuś wędkę niż rybę - wędką jest tu znajomość sposobów debugowania.

0

No ba! Jakby to było takie proste to bym doszedł dlaczego program nie działa. Myk polega na tym, że nawet gdy ustawię checkpointa na pierwszej linijce main i to i tak program się wywala. Kompiluję za pomocą Code::Blocks.
Wyciąg z konsoli:

 
This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Process returned 3 (0x3)   execution time : 1.632 s
Press any key to continue.

EDIT:
Debugger znam bardzo dobrze(z C# i Javy), tylko nie zbyt dobrze znam Code::Blocks (w sumie wcale) i nie wiem czemu funckja debugowania jest po prostu nie dostępna.

2

Żeby debugować w C:B utwórz sobie nowy projekt konsolowy-teraz pewnie kompilujesz z jednego pliku, a wtedy nie ma opcji debugu.

0

Thx @Jadeszek, niestety zaraz po uruchomieniu debugera aplikacja się zamyka zwracając 3, czyli tak samo jak wyżej.

1

Wyjście gdy kompilowałem na linuxie: terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
. Podpowiedź: program nie osiąga funkcji main.

0

Ok, dziękuję bardzo, problem rozwiązany :)

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