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

Segmentation fault

Ostatnio zmodyfikowano 2016-11-23 18:00
Autor Wiadomość
GrhuGhu
Temat założony przez niniejszego użytkownika
Segmentation fault
» 2016-11-22 18:58:02
Witam :)
Czytając artykuły na wikipedii napotkałem "Conway's Game of Life", gdy tylko to zobaczyłem mój instynkt programisty odrazu nakazał mi napisać program przeprowadzający dokładnie taką samą symulacje. :P Stwierdziłem także, że to będzie dobry pomysł na utrwalenie i wykorzystanie niedawno zdobytej wiedzy o programowaniu obiektowym. Napisałem swój kod a kompilator o dziwo nie stwierdził błędu, windowsowa konsola przesłoniła część ekranu, a na jej czarnym tle wyświetliła się pierwsza "klatka" symulacji, tylko po to aby za chwile zniknąć ustępując ustępując miejsca kolejnej "klatce". No i niestety zamiast następnej klatki mój ekran nawiedził komunikat, że program przestał działać. :(
Kod:
C/C++
#include <iostream>
#include <windows.h>

using namespace std;


class Mapa
{
public:
    bool M[ 27 ][ 82 ];
   
    Mapa()
    {
        for( int x = 1, y = 1; y < 26; x++ )
        {
            M[ y ][ x ] = 0;
            if( x == 80 )
            {
                x = 0;
                y++;
            }
        }
    }
   
    void rysuj()
    {
        for( int x = 1, y = 1; y < 26; x++ )
        {
            if( M[ y ][ x ] )
            {
                cout << "O";
            }
            else
            {
                cout << " ";
            }
            if( x == 80 )
            {
                x = 0;
                y++;
            }
        }
    }
};

Mapa head, cpy;

void check( int x, int y )
{
    int frien = 0;
   
    if( head.M[ x - 1 ][ y + 1 ] )
    {
        frien++;
    }
    if( head.M[ x ][ y + 1 ] )
    {
        frien++;
    }
    if( head.M[ x + 1 ][ y + 1 ] )
    {
        frien++;
    }
    if( head.M[ x - 1 ][ y ] )
    {
        frien++;
    }
    if( head.M[ x + 1 ][ y ] )
    {
        frien++;
    }
    if( head.M[ x - 1 ][ y - 1 ] )
    {
        frien++;
    }
    if( head.M[ x ][ y - 1 ] )
    {
        frien++;
    }
    if( head.M[ x + 1 ][ y - 1 ] )
    {
        frien++;
    }
   
    if(( frien < 2 ) ||( frien > 3 ) )
    {
        cpy.M[ x ][ y ] = 0;
    }
   
    if( frien == 3 )
    {
        cpy.M[ x ][ y ] = 1;
    }
   
    head = cpy;
}

void loop()
{
    for( int x = 1, y = 1; y < 26; x++ )
    {
        check( x, y );
        if( x == 80 )
        {
            x = 0;
            y++;
        }
    }
}

int main()
{
    head.M[ 10 ][ 20 ] = 1;
    head.M[ 11 ][ 20 ] = 1;
    head.M[ 10 ][ 21 ] = 1;
    head.M[ 11 ][ 21 ] = 1;
    head.M[ 11 ][ 22 ] = 1;
   
    while( 1 )
    {
        system( "cls" );
        head.rysuj();
        loop();
        Sleep( 1000 );
    }
}
Niestety jedyne co udało mi się ustalić to, że przy drugim wywołaniu linii nr.35 (cout << " "; - Metoda "rysuj" Klasy Mapa) kompilator wyrzuca komunikat "Segmentation fault" (Przy pierwszym wywołaniu metoda "rysuj" Działa bez zarzutów). :/ Przypuszczam, że może to mieć związek z " cpy = head; ". Dlatego proszę was o pomoc. I jeszcze jedno pytanie, czy da się jakoś użyć obiektu zarezerwowanego w innej funkcji, bez używania wskaźnika? :P
P-154019
Gibas11
» 2016-11-22 19:08:51
check( x, y );
 → 
check( y, x );

Coś ci się pomieszało przy nazwach zmiennych, teraz działa ale musisz dokładnie przeanalizować co robi program.
P-154022
Rashmistrz
» 2016-11-23 07:57:00
obiektu zarezerwowanego
?
P-154030
michal11
» 2016-11-23 09:10:37
@up chodzi pewnie o dynamicznie zaalokowany.
P-154031
GrhuGhu
Temat założony przez niniejszego użytkownika
» 2016-11-23 16:51:49
Wybaczcie, mówiąc zarezerwowany miałem na myśli normalną deklaracje obiektu (Nazwa_klasy nazwa_obiektu;) osoba prowadząca kurs, z którego się uczę lubi używać słowa "Rezerwować" jako określenia na tworzenie zmiennych. W każdym razie na pytanie dotyczące "rezerwowania" obiektów już sobie odpowiedziałem. Jednak wracając do głównego tematu... Przeanalizowałem kod i niestety nie byłem w stanie wykryć nic co mogło by powodować błąd "Segmentation fault". :/ Mimo iż po zamianie miejsc argumentów przyjmowanych przez funkcje "chceck" program działa, a raczej nie wysypuje się, to zmiana ta nie wchodzi w grę miedzy innymi, że X != Y oraz w ten sposób program próbowałby odczytać miejsce [79] tablicy, która ma tylko [27] miejsc. Nie jestem w tym jeszcze zbytnio obeznany a z błędem "Segmentation fault" spotykam się po raz pierwszy więc zupełnie nie wiem o co powoduje owy błąd, więc miałem nadzieję, że ktoś powie mi dlaczego tak jest, albo przynajmniej naprowadzi mnie na dobrą droge. :) Grzebałem trochę w internecie ale nie udało mi się, wiele ustalić, jedyne co to dowiedziałem się, że błąd ten pojawia się w momencie działania na pamięci ram, która nie należy do naszego programu (Jakoś tak to szło...), A, że błąd pojawia się przy wywołaniu "cout << "O";" to już kompletnie nie wiem co o tym myśleć, bo przecież w tym poleceniu nie działam na zmiennych, a tylko rozkazuje o wyświetlenie ciągu znaków, który jest zdefiniowany w kodzie. :x
P-154041
michal11
» 2016-11-23 17:04:44
Jakiego kompilatora używasz? U mnie na VS2013 i TDM-GCC 4.9.2 kompiluje się i odpala bez problemu, nie ma żadnych błędów z tym, że program ewidentnie nie działa, po pierwszym obiegu już nic nie printuje ale to jest problem z twoim algorytmem. W każdym razie wszystkie funkcje z maina normalnie się uruchamiają, sprawdzałem przez kilka sekund działania programu.
P-154042
mateczek
» 2016-11-23 17:08:58

odczytać miejsce [79] tablicy, która ma tylko [27] miejsc.
właśnie teraz próbuje dlatego Michał11 zalecił Ci zmianę kolejności argumentów. Zapoznaj się z debuggerem (w większości ide ikonka robala) i wykonaj śledzenie programu !!!
Zauważ,że:
C/C++
//raz w funkcji chexk masz tak
head.M[ x - 1 ][ y + 1 ] )
//a w innej na odwrót!!!
if( M[ y ][ x ] )

"Segmentation fault" spotykam się po raz pierwszy
Oj tam wystarczy pomylić indexy w tablicy(np "x" z "y")i już:P.
C/C++
int main()
{
    int a[ 10 ];
    for( int i = 0; i < 100; i++ ) {
        //tak grubsza :P
        //Nazwa sygnału: SIGSEGV
        //Znaczenie sygnału:Segmentation fault
        a[ i ] = i;
    }
}
P-154044
GrhuGhu
Temat założony przez niniejszego użytkownika
» 2016-11-23 17:34:41
Ohh.. faktycznie, pogubiłem się trochę podczas pisania kodu i wydawało mi się, że mam rację. Co prawda przeanalizowałem kod ale z tropu zbijała mnie linijka, na której debugger się zatrzymywał i wyrzucał błąd więc skupiłem się głównie na niej. Niestety nie jestem zbyt dobry w analizowaniu kodu i zawsze jak coś piszę to staram się pisać tak abym potem nie musiał tego debugować, jednak widzę, że im bardziej skomplikowane programy piszę, tym bardziej potrzebuje zdolności dobrego analizowania kodu. W każdym razie, dziękuje wszystkim za wyprowadzenie mnie z błędu i pomoc oraz przepraszam, za tak bezsensowny temat. :p
P-154045
« 1 » 2
  Strona 1 z 2 Następna strona