Funkcja set - problem ze zrozumieniem zapisu

0

Witam, mam taką klasę:

class CMatrix
{
	private:
		int Rows;
		int Columns;
		float* pData;

	public:
		CMatrix(void);
		CMatrix(int rows, int columns);
		CMatrix(const CMatrix & matrix);
		~CMatrix(void);

		void setElement(int row, int column, float element);
		float getElement(int row, int column);
...};

CMatrix::CMatrix(int rows, int columns)
{
	Rows = rows;
	Columns = columns;
	pData = new float[Rows * Columns];

	float* pEnd = &pData[Rows * Columns];

	for(float* p = pData; p < pEnd; p++)
		*p = 0.0;
}



void CMatrix::setElement(int row, int column, float element)
{
  
    *(pData+  row * Columns + column) = element;

}

float CMatrix::getElement(int row, int column)
{
	return *(pData + row * Columns + column);
}

I mam pytanie, bo ta funkcja set działa prawidłowo (podaje się do niej wiersz i kolumnę oraz element jaki trzeba do niej wpisać), jednakże nie rozumiem za bardzo tego zapisu w tej funkcji. Mógłby mi ktoś powiedzieć jak to działa ? bo się nigdy nie spotkałem z takim zapisem. ( element to nie jest wskaźnik, a się go przypisuje do wskaźnika (tylko jakiego?)).

0

Zapis oznacza tyle samo co

pData[row*Columns+column]

A to znaczy mniej więcej tyle co pData[column][row] ale takiego zapisu użyć nie możesz bo tablica jest jednowymiarowa. Jeśli chcesz "zasymulować" dwuwymiarową tablicę na jednowymiarowym bloku pamięci to komórka o współrzędnych (x,y) (przy założeniu że pierwszy wymiar tablicy to M) znajduje się o x*M+y komórek od początku bloku pamięci.

I nikt tu niczego nie przypisuje do wskaźnika! Masz tam przecież dereferencje (gwiazdkę) wskaźnika więc wpisujesz "element" jako wartość w komórce pamięci o adresie przechowywanym przez ten wskaźnik.

0

Ok, a jak to jest z dodawaniem wskaźnika (pdata) do typu wbudowanego Jak to się dzieje w funkcji set? Nie ma tam dereferencji przy wskaźniku pdata. I skąd mam wiedzieć o jaki wskaźnik chodzi, Jak przy nim nie ma nazwy..

0

Jesli masz wskaznik typu int* pointer, ktory wskazuje na adres 0x4000. To:
Inkrementacja wskaznika: pointer++, zwroci 0x4004
Dodanie liczby x o wartosci 10 do wskaznika: pointer + x, zwroci 0x4040. Czyli pointer +x * sizeof(*pointer)

Odejmowanie dziala odwrotnie do dodawania.

0

@mikhal taka operacja powoduje po prostu przesuwanie wskaźnika. Przesuwa się go o tyle "jednostek" ile dodasz. Jednostek, czyli tyle bajtów ile ma typ na który masz wskaźnik.
Jak masz wskaźnik na int to dodanie 1 przesunie go o 4 bajty (czyli po prostu na kolejnego inta), jak masz wskaźnik char to przesunie ci go o 1 bajt etc.

0

Ok, dziękuję za odpowiedź.

1

Zastanów się nad zastąpeniem getElement i setElement czymś takim:

float *CMatrix::operator[](int row)
  {
   return pData+row*Columns;
  }

Wtedy masz:

CMatrix m(10,10);
m[9][9]=0; // zamiast m.setElement(9,9,0)
cout<<m[0][0]; // zamiast cout<<m.getElement(0,0);

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