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

Program się zamyka informując, że debbuger "exited with code 03"

Object Storage Arubacloud
0 głosów
206 wizyt
pytanie zadane 17 stycznia 2019 w C i C++ przez niezalogowany
otwarte ponownie 19 stycznia 2019

Mam problem, którego nie umiem zrozumieć i nie wiem po czyjej stronie leży. Otóż program wywala błąd kodu 3 w takim programie. Co może być tego przyczyną?

(Zasypanie coutami po próbie przepisania wartości string na tablicę liczb wynika z prób zrozumienia co jest nie tak z przepisaniem i jakie wartości są przypisane w danym momencie do czego.- ale nie o tym temat)

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
    ifstream myReadFile;
    string output = 0;
	int sum = 0;

	myReadFile.open("C:\\Users\\xxx\\Desktop\\captha.txt");

	if (!myReadFile.good())
	{
		cout << "Nie ma pliku.";
		getchar();
		return 0;
	}

	while (!myReadFile.eof())
	{
		myReadFile >> output;
        cout << "Wejscie: " << output << endl;
	}

    int dlugosc = output.length();
	double znak[dlugosc];
    stringstream s[dlugosc];

    for (int i = 0; i <= dlugosc; i++)
	{
	    s[i] << output[i];
	    s[i] >> znak [i];

	    cout << "O " << i << " : " << output [i] << "->" << " Z " << i << " : " << znak [i] << endl;
	}

    cout << "Dlugosc: " << output.length() << endl;
	cout << "Output: " << output << endl;
	cout << "Znak: " << znak << endl;

getchar();
return 0;
}

 

komentarz 17 stycznia 2019 przez criss Mędrzec (172,590 p.)
for (int i = 0; i <= dlugosc; i++)

Tablice sa indeksowane od 0 yatem indeksami tablicz N+elemntowej s 0,1,2,...,N-1 

2 odpowiedzi

0 głosów
odpowiedź 17 stycznia 2019 przez C☺ndzi Stary wyjadacz (12,100 p.)
wybrane 19 stycznia 2019
 
Najlepsza

Linijka 29 i 30 - nie można tego robić w ten sposób, ponieważ w oficjalnym standardzie ten zapis jest niewłaściwy. Prawdopodobnie twój kompilator to akceptuje, ale to zły nawyk. Szukaj "dynamiczna alokacja", "std::vector". Spróbuj zastąpić ten kod tym:
 

vector<double> znak;
vector<stringstream> s;

znak.resize(dlugosc);
s.resize(dlugosc);

vector jest dynamiczną tablicą - tego prawdopodobnie potrzebujesz. W internecie znalazłem, że gdy program zwraca "3" to brakuje mu pamięci. Może wczytujesz duży plik? Sprawdź też czy ścieżka do pliku jest dobra.

komentarz 17 stycznia 2019 przez niezalogowany

Dzięki. Będę pamiętać na przyszłość.

Wczytuję jedynie plik txt, który ma 2004 cyfry. Ścieżka jest dobra, jedynie ocenzurowana.

Po wdrożeniu waszych propozycji wciąż mam nieokreślony problem, ale to chyba wina już złej wersji kompilatora czy debbugera. Czy zrobić nowy temat o tym błędzie, czy potrafilibyście wskazać przyczynę?

komentarz 17 stycznia 2019 przez j23 Mędrzec (195,220 p.)

ale to chyba wina już złej wersji kompilatora czy debbugera.

Na 99% to wina twojego kodu ;)

 

Jeśli dobrze rozumiem tę dziwaczną cześć ze stringstreamami, zrób lepiej tak:

std::vector<double> znaki;

znaki.reserve(output.size());
for(auto c : output) { znaki.push_back(c - '0'); }

 

komentarz 17 stycznia 2019 przez niezalogowany
Cóż, potrzebuję zczytać z pliku ciąg 2004 cyfr i potem wykonać obliczenia na każdym pojedynczym z nich. Sprawdzić jaka liczba jest następna, czy są takie same itd

(Tak dokładnie to https://adventofcode.com/2017/day/1)

Było dużo problemów z odczytem owej cyfry z pliku i w ostateczności wyszło, że pobranie jej jako string a potem przełożenie na tablice jako wartości liczbowe jest najskuteczniejsze. W końcu i tak później muszę wykonać działania na liczbach.

Niestety trochę się już gubię gdzie to dać, bo wrzucenie tego za stringstreamy daje długą listę na której końcu jest

"0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: 0Znak: -2.53017e-098"

Wybacz, że pytam o rzeczy już niezwiązane z tematem ale się gubię z tym nadmiernym wykorzystaniem pamięci :/
komentarz 17 stycznia 2019 przez j23 Mędrzec (195,220 p.)
edycja 17 stycznia 2019 przez j23

Jeśli dobrze rozumiem te zadanie, to tu nie trzeba żadnych tablic/vectorów, wystarczy czytać bezpośrednio z pliku po znaku/cyfrze i sumować zgodnie z opisaną zasadą.

Skąd Ci się wziął typ double?

Jakoś tak to widzę:

    char c, first_c, prev_c = 0;
    int sum = 0;

    is >> c;
    first_c = c;
    
    do
    {
        if(prev_c == c) sum += c - '0';
        prev_c = c;
    }
    while(is >> c);
    
    if(first_c == prev_c) sum += prev_c - '0';
    
    std::cout << sum << '\n';

is to strumień plikowy.

komentarz 19 stycznia 2019 przez niezalogowany
edycja 19 stycznia 2019

Dzięki za całą pomoc. Po tym jak zapytałeś o double jakoś mnie wyciągnęło z ciemności błądzenia.

Ostateczna potrzebna część kodu wygląda tak:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>

using namespace std;

int main()
{
    ifstream myReadFile;
    string output = "0";

    myReadFile.open("C:\\Users\\xxx\\Desktop\\captha.txt");

    if (!myReadFile.good())
    {
        cout << "Nie ma pliku.";
        getchar();
        return 0;
    }

    while (!myReadFile.eof())
    {
        myReadFile >> output;
        cout << "Wejscie: " << output << endl;
    }

    vector<int> znak;
    int size = output.size();

    for (int i = 0; i < size; ++i)
    {
        znak.push_back(output[i] - '0');
    }

getchar();
return 0;
}

Niestety dalej nie wiem czemu dawał błąd odnośnie stringstreama jakoby to zabierało niedozwoloną ilość pamięci. Jak kiedyś odkryję to zedytuję.

0 głosów
odpowiedź 17 stycznia 2019 przez RafalS VIP (122,820 p.)
string output = 0;

Nie wiem co tu chciałeś zrobić. Obawiam się, że 0 zostało skonwertowane na nullptr, przez co wywołałeś taki konstruktor:

basic_string( const CharT* s,
              const Allocator& alloc = Allocator() );

 w ciele, którego prawdopodobnie jest dereferencja tego const CharT*, któremu przekazałeś nulla.

string output;

Tak to powinno wyglądać.

Niżej robisz coś tak dziwnego, że nawet nie wiem co chciałeś osiągnąć :P

komentarz 17 stycznia 2019 przez niezalogowany
edycja 17 stycznia 2019

Uciekły mi nawiasy "0" :d 

Powiedziano mi, że lepiej wskazać ręcznie jakąś wartość by program nie odnosił się do niewiadomo jakich śmieci.

Później zczytuję ciąg cyfr o długości 2004 z pliku i przypisuję je poszczególnym miejscom w tablicy long, by móc potem dokonać działań z weryfikacją na poszczególnych miejscach.

Było tyle problemów z tym przepisywaniem z stringa/chara na inty (w pliku .txt było wtedy np 5 cyfr), że wydawało mi się łatwiejszym sposobem poprosić program o wypisanie wartości w każdym etapie, by móc zobaczyć w czym może tkwić błąd i temu zaradzić :/

Ale rzeczywiście po naprawieniu jak wspomniałeś program ruszył aż do wczytania 2003 kroku pętli a potem taki problem odnoszący się do bodajże "s[i] << output[i];"

komentarz 19 stycznia 2019 przez RafalS VIP (122,820 p.)

 że lepiej wskazać ręcznie jakąś wartość by program nie odnosił się do niewiadomo jakich śmieci.

Ale tylko odnośnie prostych zmiennych. Dla klas takich jak np string zapis:

string s;

oznacza wywołanie konstruktora bez argumentów, który już się tym zajmie.

 

Podobne pytania

0 głosów
1 odpowiedź 116 wizyt
0 głosów
1 odpowiedź 970 wizyt
0 głosów
1 odpowiedź 224 wizyt

92,762 zapytań

141,686 odpowiedzi

320,499 komentarzy

62,106 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

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!

...