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: #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 |
|
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. |
|
Rashmistrz |
» 2016-11-23 07:57:00 |
|
michal11 |
» 2016-11-23 09:10:37 @up chodzi pewnie o dynamicznie zaalokowany. |
|
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 |
|
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. |
|
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: head.M[ x - 1 ][ y + 1 ] )
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. int main() { int a[ 10 ]; for( int i = 0; i < 100; i++ ) { a[ i ] = i; } }
|
|
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 |
|
« 1 » 2 |