Zadanie 4.1 z matury 2015 problem z segmentation fault
Ostatnio zmodyfikowano 2015-09-15 19:42
tixer Temat założony przez niniejszego użytkownika |
Zadanie 4.1 z matury 2015 problem z segmentation fault » 2015-09-14 19:33:17 Mam przy tym zadaniu problem z jedną liczbą dokładnie w wierszu 421. #include <iostream> #include <string> #include <fstream> #include <vector>
using namespace std;
void szukajWszystkichZnakowZER( std::string & tekst, char szukanyZnak, vector < int > & wynik ) { int ile = 0; size_t znalezionaPozycja = tekst.find( szukanyZnak ); if( znalezionaPozycja == std::string::npos ) { std::cout << "Nie znaleziono znaku 0 w tekscie" << std::endl; return; } do { znalezionaPozycja = tekst.find( szukanyZnak, znalezionaPozycja + 1 ); ++ile; } while( znalezionaPozycja != std::string::npos ); wynik.push_back( ile ); }
int main() { ifstream liczby; liczby.open( "/home/bbaa/Desktop/Dane_PR2/liczby.txt" ); if( liczby.good() ) cout << "Otwarto poprawnie" << endl; vector < string > linie; string linia; for( int i = 0; i < 1000; i++ ) { getline( liczby, linia ); linie.push_back( linia ); } int iloscZer = 0; int iloscJedynek = 0; int iloscTAKASAMA = 0; for( int i = 0; i < 1000; i++ ) { string naszTekst = linie[ i ]; vector < int > wynikzer, wynikjedynek; szukajWszystkichZnakowZER( naszTekst, '0', wynikzer ); szukajWszystkichZnakowZER( naszTekst, '1', wynikjedynek ); if( wynikzer[ i ] > wynikjedynek[ i ] ) { if( wynikzer[ i ] == wynikjedynek[ i ] ) { ++iloscTAKASAMA; } ++iloscZer; } else { ++iloscJedynek; } } cout << "W " << iloscZer << " liczbach ilosc zer jest wieksza od ilosci jedynek" << endl; cout << "Jest jedynek: " << iloscJedynek << endl; cout << "Zer i jedynek jest tyle samo w: " << iloscTAKASAMA << endl; return 0; }
Wywala mi Segmentation fault. Według mnie jest to spowodowane, że w tej liczbie na pozycji 421 nie ma żadnego 0, bo gdy dopiszę do niej 0 to wszystko działa poprawnie. W czym tkwi problem? Jeszcze jest problem z liczeniem, bo raz podaje o jedną liczbę więcej, a raz o jedną mniej i do tego już nic nie wymśliłem dlaczego tak się dzieje. |
|
kmlkamilek |
» 2015-09-14 20:28:58 Zamieść całkowitą treść błędu i wklej konkretny fragment kodu w którym ci to wywala. "Wiersz 421" niewiele nam mówi, skoro kod który zamieściłeś ma raptem 100. |
|
tixer Temat założony przez niniejszego użytkownika |
» 2015-09-14 20:52:19 Chodzi o wiersz 421 z pliku liczby.txt http://www.cke.edu.pl/images/_EGZAMIN_MATURALNY_OD_2015/Arkusze_egzaminacyjne/2015/formula_od_2015/Dane_PR2.zip a błąd wywala z pętli for( int i = 0; i < 1000; i++ ) { string naszTekst = linie[ i ]; vector < int > wynikzer, wynikjedynek; szukajWszystkichZnakowZER( naszTekst, '0', wynikzer ); szukajWszystkichZnakowZER( naszTekst, '1', wynikjedynek ); if( wynikzer[ i ] > wynikjedynek[ i ] ) { if( wynikzer[ i ] == wynikjedynek[ i ] ) { ++iloscTAKASAMA; } ++iloscZer; } else { ++iloscJedynek; } }
gdy i ma więcej niż 421 co wypada na 421 wiersz liczby.txt, ale dla reszty wierszy wykonuje się poprawnie. |
|
mateczek |
Urzywaj debugera sam znajdziesz błąd » 2015-09-15 05:34:35 https://pl.wikibooks.org/wiki/Programowanie_C%2B%2B_Qt4_w_systemie_Gnu-Linux/U%C5%BCywaj_Debuggera!!!
Filmik poprawię jak przyjdzie mi mikrofon!!!
PS kontener vector<int> wynikzer ma 1000 elementów?? czy piszesz w kosmos?? |
|
Monika90 |
» 2015-09-15 10:30:45 Napisz funkcję liczącą zera i jedynki prościej. Nie używaj find, wystarczy iterować po zawartości stringa, za każdym razem gdy się trafi na właściwy znak zwiększyć licznik o jeden i na koniec zwrócić ten licznik. |
|
tixer Temat założony przez niniejszego użytkownika |
» 2015-09-15 17:27:34 Według mnie kontener vector<int> wynikzer ma 1000 elementow, bo gdy nie znajdzie zera to powinien przypisać 0 dla danej pozycji czyż nie?? Na iteratorach itp się jeszcze nie znam. |
|
carlosmay |
» 2015-09-15 17:41:36 Jak nie znajdzie zera w linii to wychodzi z funkcji ale nie powiększa vectora dla zer, więc przy porównaniu vectorow dla zer i jedynek ten od zer wychodzi poza rozmiar i stad masz błąd. Jest o jeden mniejszy od vectora z jedynkami. |
|
tixer Temat założony przez niniejszego użytkownika |
» 2015-09-15 17:43:26 Z jakiego powodu wychodzi z funkcji gdy nie znajdzie zera? Czy przez nie znane mi string::npos? Nigdy nie używałem debuggera i chyba nie działa mi poprawnie, bo wywala takie coś Active debugger config: GDB/CDB debugger:Default Building to ensure sources are up-to-date Selecting target: Debug Adding source dir: /home/bbaa/Desktop/MaturaINF/liczbyza/ Adding source dir: /home/bbaa/Desktop/MaturaINF/liczbyza/ Adding file: /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza Changing directory to: /home/bbaa/Desktop/MaturaINF/liczbyza/. Set variable: LD_LIBRARY_PATH=.:
[debug]Command-line: gdb -nx -fullname -quiet -args /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza [debug]Working dir : /home/bbaa/Desktop/MaturaINF/liczbyza
Starting debugger: gdb -nx -fullname -quiet -args /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza done
[debug]execvp(gdb, -nx, -fullname, -quiet, -args, /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza) failed with error 2!
Debugger finished with status 1 Selecting target: Debug Adding source dir: /home/bbaa/Desktop/MaturaINF/liczbyza/ Adding source dir: /home/bbaa/Desktop/MaturaINF/liczbyza/ Adding file: /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza Changing directory to: /home/bbaa/Desktop/MaturaINF/liczbyza/. Set variable: LD_LIBRARY_PATH=.:
[debug]Command-line: gdb -nx -fullname -quiet -args /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza [debug]Working dir : /home/bbaa/Desktop/MaturaINF/liczbyza
Starting debugger: gdb -nx -fullname -quiet -args /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza done
[debug]execvp(gdb, -nx, -fullname, -quiet, -args, /home/bbaa/Desktop/MaturaINF/liczbyza/bin/Debug/liczbyza) failed with error 2!
Debugger finished with status 1 Czy przy konfiguracji debuggera wystarczy, że w Executable Path wpiszę gdb? |
|
« 1 » 2 |