Naruszenie ochrony pamięci (core dumped)

0

Witam,

Moim zadaniem jest stworzenie gry - poki co tekstowej, która będzie polegała na przeprowadzeniu punkt z lewej strony na prawą i odwrotnie.
W międzyczasie mają być "ruszające się" przeszkody, więc póki co wykombinowałem to na tablicy, która przemieszcza X - przeszkody i . - wolne miejsca, lecz podczas przemieszczania wyskakuje błąd jak w temacie. ( przemieszczanie nie działa ) Poniżej wrzucam kod:

Podejrzane miejsce o błąd to

 bool przeszkoda::CzyJest(int y,int x)
{
	if (tablica[y][x]->typ == 0)

Lecz nie wiem, dlaczego, nie wychodzę nigdy poza stworzoną tablicę.

Z góry dziękuję za odpowiedź,
Pozdrawiam,
Krystian

funkcje.h

#ifndef _FUNKCJE_H
#define _FUNKCJE_H

#include <iostream> 
#include <iomanip> // setw()
#include <cstdlib> // srand()
#include <ctime> // time()
#include <time.h>

using namespace std;



class plansza;
class maszt;
class przeszkoda;

//*********************************************************************************************************************************************************

// ./fun/plansza.cpp

class plansza 
{
public:
  maszt  ***wsk;  // wskaznik do wskaznika na wskaznik :P
  plansza();
  ~plansza();
  void wyswietl();
};

//*********************************************************************************************************************************************************

// ./fun/maszt.cpp

class maszt  // elementarna klasa
{
public:
  char stan;
  int typ; // 0 - przeszkoda, 3 - puste,
  maszt() : stan('.'), typ(3) {} // konstruktor, na poczatku nie ma zadnych stakow czyli maszty sa puste
  void wyswietl(); 
};

//*********************************************************************************************************************************************************


class przeszkoda
{
	public:
		maszt* tablica[30][42];
		void buduj(plansza &NazwaPlanszy);
		void ruch (int,plansza&);
		bool CzyJest(int,int);
};



void czekaj( int sekundy );
#endif 

zmienne.h

 #ifndef _ZMIENNE_H
#define _ZMIENNE_H
#include "funkcje.h"

	const int poziomtab = 47; // dotyczy tablicy poziomej
	const int piontab = 25; //dotyczy tablic pionowej

	const bool Linux=true; // dla windowsa wpisac false
	extern bool Testowanie; // zmien na false, jak nie chcesz widziec, gdzie sa statki
#endif

main.cpp

#include "../lib/funkcje.h"
#include "../lib/zmienne.h"

	bool Testowanie=true;

int main()
{

	srand(time(NULL));
	int dl;
	
	
	plansza statki;
	przeszkoda prz;
	prz.buduj(statki);
	
	for(int i= 0; i <10; i++)
	{
		statki.wyswietl();
		prz.ruch(1,statki);
		czekaj(1);
	}
	for (int i = 0; i< 10; i++)
		prz.CzyJest(i,1);
	
	return 0;
} 

plansza.cpp

 #include "../lib/funkcje.h"
#include "../lib/zmienne.h"



plansza::plansza()  // konstruktor planszy
{
  wsk=new maszt**[piontab+5];   // plansza jest 2-wymiarowa tablica wskaznikow do masztow
  for(int i=0; i<piontab+5; i++)  // rozmiar +3 a plansza zeby nie bylo przekroczenia zakresu przy losowym ustawianiu statkow 
  {							
      wsk[i]=new maszt*[poziomtab+5]; 
      for(int j=0; j<poziomtab+5; j++)
	  {
		  wsk[i][j]=new maszt();  // pojedynczy maszt
	  }
  }
}

plansza::~plansza()  // destruktor planszy, wykonuje sie kiedy plansza jest niszczona czyli po zakonczeniu gry
{
  cout << "Plansza kaput!\n";  // do testowania zadzialania destruktora
  for(int i=0; i<piontab+5; i++)   // zwolnienie zaalokowanej pamieci
  {
	  for(int j=0; j<poziomtab+5; j++)
	  {
		  delete wsk[i][j];  // niszczymy pojedyncze maszty
	  }
	  delete wsk[i];  // ... tablice masztow
  }
  delete wsk;   // ... i tablice tablic
  if(!Linux) system("pause");
}

void plansza::wyswietl() // wyswietlanie planszy
{
  if(Linux)system("clear");   // linux
  else system("cls"); // windows
  for(int i=1; i<=piontab; i++)  // wyswietlenie 16 wierszy
    {
	cout << setw(2) << i << " ";  // ladny rowny odstep
    for(int j=1; j<=poziomtab; j++)
		 wsk[i-1][j-1]->wyswietl(); // wyswietlanie 16 kolumn masztow
		cout << endl;

  }
  cout << "   ";//odpowiada za dolne liczby
	for (int j=1;j<=poziomtab;j++)
	{
		if(j<10)
			cout << j << "  ";
		else
			cout << j << " ";
	}
	cout << endl;
}

maszt.cpp

#include "../lib/funkcje.h"
#include "../lib/zmienne.h"


void maszt::wyswietl()
{
    if(Testowanie)  // jak testujemy to pokazujemy statki od razu
		cout << stan << "  ";
	else  // jak gramy to statki sa ukryte
		(stan=='X') ? cout << ".  " : cout << stan << "  ";
} 

przeszkody.cpp

#include "../lib/funkcje.h"
#include "../lib/zmienne.h"

void przeszkoda::buduj(plansza &NazwaPlanszy)
{
	for(int x=1;x<47;x=x+2)
	{
		int i=0;
		int ilosc = rand()%5 + 18;
		while( i < ilosc)
		{
			int y=rand()%25;
			NazwaPlanszy.wsk[y][x]->stan='X';
			NazwaPlanszy.wsk[y][x]->typ=0;
			tablica[y][x]=NazwaPlanszy.wsk[y][x];
			i++;
		}
	}
}
bool przeszkoda::CzyJest(int y,int x)
{
	if (tablica[y][x]->typ == 0)
	{
		cout << "1 ";
		return true;
	}
	else
	{
		cout << "0 ";
		return false;

	}
}

void przeszkoda::ruch (int yw,plansza &NazwaPlanszy)
{
	for( int x=0;x < poziomtab; x++)
	{
		for(int y=0;y<piontab;y++)
		{
			if(CzyJest(y,x))
			{		
				int kw = rand()%2; // 0 do góry, 1 w dół 
				if (kw == 0)
				{
					if((y<piontab) &&  (!CzyJest(y+1,x)))
					{
						NazwaPlanszy.wsk[y][x]->stan='.';
						NazwaPlanszy.wsk[y][x]->typ=3;
						tablica[y][x]=NazwaPlanszy.wsk[y][x];
						NazwaPlanszy.wsk[y+1][x]->stan='X';
						NazwaPlanszy.wsk[y+1][x]->typ=0;
						tablica[y+1][x]=NazwaPlanszy.wsk[y+1][x];
					}
					 else 
						continue;
				}
				else if( kw == 1)
				{
					if((y>0) && (!CzyJest(y-1,x)))
					{
						NazwaPlanszy.wsk[y][x]->stan='.';
						NazwaPlanszy.wsk[y][x]->typ=3;
						tablica[y][x]=NazwaPlanszy.wsk[y][x];
						NazwaPlanszy.wsk[y-1][x]->stan='X';
						NazwaPlanszy.wsk[y-1][x]->typ=0;
						tablica[y-1][x]=NazwaPlanszy.wsk[y+1][x];
					}
					 else 
						continue;
				}
			}
		}
	}
} 

zmiany.cpp

 #include "../lib/funkcje.h"
#include "../lib/zmienne.h"


void czekaj( int sekundy )// opcja czekania
{
    clock_t koniec_czekania;
    koniec_czekania = clock() + sekundy * CLOCKS_PER_SEC;
    while( clock() < koniec_czekania ) { }
}
1

Takie spaghetti że raczej nikt tego nie tknie. Odpal pod debugerem a potem pod valgrindem i ci wypiszą gdzie wyłazisz poza tablicę albo gdzie coś źle alokujesz.

1

Tylko niektóre elementy tablicy tablica są zainicjalizowane. Pozostałe wskaźniki nawet nie są nullami, tylko zawierają śmieci.
Ty próbujesz dereferować -> śmieciowego wskaźnika.

0

Problem rozwiązałem sam, już jakiś czas temu :) Ale dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1