Tablica Dwuwymiarowa jako Klasa, przechowująca elementy w ciągłym obszarze pamięci.
Ostatnio zmodyfikowano 2013-07-21 11:04
Bimbol Temat założony przez niniejszego użytkownika |
Tablica Dwuwymiarowa jako Klasa, przechowująca elementy w ciągłym obszarze pamięci. » 2013-07-20 22:37:43 Witam, mam do zrobienia pewne zadanie, jednak nie rozumiem drugiej części. Polecenie jest następujące: Spróbuj napisać podobną klasę dla tablicy dwuwymiarowej. (Trudne) Niech przechowuje ona elementy w ciągłym obszarze pamięci - tak, jak robi to kompilator ze statycznymi tablicami dwuwymiarowymi. |
Napisałem już klasę z dwuwymiarową tablicą. Tylko teraz nie wiem o co chodzi w dalszej częśći. W razie czego dorzucam kod. main.cpp: #include "array.h"
int main() { CIntArrayDouble Test( 3, 3 ); Test.ChangeSize( 2, 4 ); for( unsigned i = 0; i < Test.GetIndexSize1(); ++i ) for( unsigned j = 0; j < Test.GetIndexSize2(); ++j ) Test.SetValue( i, j, i + j ); for( unsigned i = 0; i < Test.GetIndexSize1(); ++i ) for( unsigned j = 0; j < Test.GetIndexSize2(); ++j ) cout << Test.GetValue( i, j ) << endl; return 0; }
array.h: #ifndef ARRAY_H_INCLUDED #define ARRAY_H_INCLUDED
#include <iostream> #include <memory.h> #include <conio.h>
using namespace std;
class CIntArrayDouble { private: int ** m_Table; unsigned m_Index1; unsigned m_Index2; public: CIntArrayDouble( unsigned Index1, unsigned Index2 ) : m_Index1( Index1 ) , m_Index2( Index2 ) { m_Table = new int *[ m_Index1 ]; for( unsigned i = 0; i < m_Index1; ++i ) m_Table[ i ] = new int[ m_Index2 ]; } ~CIntArrayDouble() { for( unsigned i = 0; i < m_Index1; ++i ) delete[] m_Table[ i ]; delete[] m_Table; } int GetValue( unsigned Index1, unsigned Index2 ) { if( Index1 >= m_Index1 || Index2 >= m_Index2 ) return - 1; return m_Table[ Index1 ][ Index2 ]; } bool SetValue( unsigned Index1, unsigned Index2, int value ) { if( Index1 >= m_Index1 || Index2 >= m_Index2 ) return false; m_Table[ Index1 ][ Index2 ] = value; return true; } unsigned GetIndexSize1() { return m_Index1; } unsigned GetIndexSize2() { return m_Index2; } void ChangeSize( unsigned Index1, unsigned Index2 ) { int ** Array = new int *[ Index1 ]; for( unsigned i = 0; i < Index1; ++i ) Array[ i ] = new int[ Index2 ]; if( Index1 < m_Index2 ) for( unsigned i = 0; i < Index1; ++i ) { if( Index2 < m_Index2 ) memcpy( Array[ i ], m_Table[ i ], sizeof( int ) * Index2 ); else memcpy( Array[ i ], m_Table[ i ], sizeof( int ) * m_Index2 ); delete[] m_Table[ i ]; } else for( unsigned i = 0; i < m_Index1; ++i ) { if( Index2 < m_Index2 ) memcpy( Array[ i ], m_Table[ i ], sizeof( int ) * Index2 ); else memcpy( Array[ i ], m_Table[ i ], sizeof( int ) * m_Index2 ); delete[] m_Table[ i ]; } delete[] m_Table; m_Table = Array; m_Index1 = Index1; m_Index2 = Index2; } };
#endif
|
|
DejaVu |
» 2013-07-21 00:11:53 Wystarczy zaalokować pamięć: int * pTablica = new[ m_rozmiarY * m_rozmiarX ];
i potem napisać: int & CKlasa::wartosc( int y, int x ) { return pTablica[ y * m_rozmiarX + x ); }
CKlasa tablica( 20, 10 );
for( int x = 0; x < 20; ++x ) for( int y = 0; y < 10; ++y ) tablica.wartosc( y, x ) = rand() % 10;
for( int x = 0; x < 20; ++x ) for( int y = 0; y < 10; ++y ) std::cout << tablica.wartosc( y, x ) << " ";
|
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-07-21 11:04:57 Co prawda chciałem by ktoś dogłębniej wytłumaczył treść, bo wolałem to napisać sam. Mimo, wszystko dziękuję za odpowiedź :) Temat do zamknięcia. |
|
« 1 » |