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

Zadanie 4.1 z matury 2015 problem z segmentation fault

Ostatnio zmodyfikowano 2015-09-15 19:42
Autor Wiadomość
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.

C/C++
#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.
P-137512
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.
P-137514
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
C/C++
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.
P-137515
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??
P-137520
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.
P-137529
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.
P-137536
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.
P-137537
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?
P-137538
« 1 » 2
  Strona 1 z 2 Następna strona