Obiekt zawierający tablicę - problem z odczytem danych

0

Witam,
Napisałem taki program:

tablica_test.cpp:

#include <iostream>
#include "tablica.h"

using namespace std;

int main(){
	
	tablica tab1;
	tab1.wyswietl_pole(0, 0);
	
	return 0;
} 

tablica.h:

#ifndef TABLICA_H
#define TABLICA_H
class tablica{
	private:
		int szerokosc;
		int dlugosc;
		char ** pole;
	public:
		tablica();
		void wyswietl_pole(int a, int b);
};
#endif 

tablica.cpp:

#include "tablica.h"
#include <iostream>
#include <fstream>

using namespace std;

tablica::tablica(){
	//otwieranie pliku z mapa
	ifstream wejscie("tablica.txt");
	if(!wejscie)
		cout << "Nie mozna otworzyc pliku!" << endl;
		
	//wczytywanie wielkosci mapy
	wejscie >> szerokosc;
	wejscie >> dlugosc;
	
	//alokacja miejsca na tablice
	int ** pole = new int*[dlugosc];
	for(int i = 0; i < dlugosc; i++){
		pole[i] = new int[szerokosc];
	}

	//wczytanie tablicy
	char znak;
	for(int i = 0; i < dlugosc; i++){
		for(int j = 0; j < szerokosc; j++){
			wejscie.get(znak);
			if(znak == '\n')
				wejscie.get(znak);				
			pole[i][j] = znak;
		}
		//cout << endl;
	}
	cout << "pole wewnatrz konstruktora" << endl;
	cout.put(pole[0][0]);
	cout << endl;
}

void tablica::wyswietl_pole(int a, int b){
	cout << "pole wewnatrz funkcji wyswietlajacej" << endl;
	cout.put(pole[a][b]);
}

tablica.txt:

1
1
E

Ogólnie program wczytuje tablicę zmiennych typu char do tablicy, którą zawiera dany obiekt. Chciałbym móc wyświetlać pojedyncze pola. Kiedy włączam program, podczas działania konstruktora wyświetla się bez problemu pole[0][0], a kiedy wywołuję osobną funkcję wyświetlającą, to pojawia się błąd naruszenia ochrony pamięci. Jak rozwiązać ten problem?

0

Wewnątrz konstruktora tworząc int ** pole zasłaniasz sobie w ten sposób składową klasy, i cały czas operujesz na obszarze pamięci do którego wskaźnik jest gubiony po zakończeniu działania przez konstruktor.

0

Rzeczywiście - głupi błąd. Ponadto zauważyłem, że w poniższym fragmencie były złe typy zmiennych - efekt kopiowania fragmentów z innego programu. Poprawiłem to:

//alokacja miejsca na tablice
	char**pole = new char*[dlugosc];
	for(int i = 0; i < dlugosc; i++){
		pole[i] = new char[szerokosc];
	} 

W jaki sposób zrobić, żeby konstruktor korzystał ze wskaźnika będącego składową klasy zamiast tworzył nowy?

0

Po prostu nie twórz nowego wskaźnika tylko operuj na obecnym składniku klasy:

        pole = new char*[dlugosc];
        for(int i = 0; i < dlugosc; i++){
                pole[i] = new char[szerokosc];
        }
0

Wielkie Dzięki, wszystko śmiga! :D

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