• 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"

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
273 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,260 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,260 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ź 139 wizyt
0 głosów
1 odpowiedź 1,110 wizyt
0 głosów
1 odpowiedź 329 wizyt

93,176 zapytań

142,185 odpowiedzi

321,980 komentarzy

62,506 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1637p. - dia-Chann
  2. 1614p. - Łukasz Piwowar
  3. 1599p. - CC PL
  4. 1597p. - Łukasz Eckert
  5. 1537p. - Łukasz Siedlecki
  6. 1531p. - rucin93
  7. 1356p. - ssynowiec
  8. 1351p. - Tomasz Bielak
  9. 1328p. - Michal Drewniak
  10. 1273p. - Adrian Wieprzkowicz
  11. 1232p. - Mikbac
  12. 1181p. - rafalszastok
  13. 1169p. - Grzegorz Aleksander Klementowski
  14. 1155p. - Piotr Aleksandrowicz
  15. 1149p. - Michał Telesz
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...