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