[C++] Klasa jako dynamiczna dwuwymiarowa tablica
Ostatnio zmodyfikowano 2013-07-19 13:14
Bimbol Temat założony przez niniejszego użytkownika |
[C++] Klasa jako dynamiczna dwuwymiarowa tablica » 2013-07-18 17:52:37 Witam, Napisałem klase, która ma służyć jak tablica dwuwymiarowa. Wszystko działa dobrze, oprócz metody SetSize( unsigned Size1, unsigned Size2 ) main.cpp #include "array.h"
using namespace std;
int main() { CArrayDouble Tab( 1, 10 ); Tab.SetSize( 2, 15 ); cout << "Size: " << Tab.GetSize1() << " " << Tab.GetSize2() << endl; for( unsigned i = 0; i < Tab.GetSize1(); ++i ) for( unsigned j = 0; j < Tab.GetSize2(); ++j ) Tab.SetValue( i, j, i + j ); for( unsigned i = 0; i < Tab.GetSize1(); ++i ) for( unsigned j = 0; j < Tab.GetSize2(); ++j ) cout << Tab.ShowValue( i, j ) << endl; return 0; } array.h: #ifndef ARRAY_H_INCLUDED #define ARRAY_H_INCLUDED
#include <iostream> #include <memory.h>
class CArrayDouble { static const unsigned DEFAULT_SIZE = 1; private: int ** nTable; unsigned m_Size1; unsigned m_Size2; public: CArrayDouble() { nTable = new int *[ DEFAULT_SIZE ]; for( unsigned i = 0; i < DEFAULT_SIZE; ++i ) nTable[ i ] = new int[ DEFAULT_SIZE ]; } CArrayDouble( unsigned Size1, unsigned Size2 ) : m_Size1( Size1 ) , m_Size2( Size2 ) { nTable = new int *[ Size1 ]; for( unsigned i = 0; i < Size1; ++i ) nTable[ i ] = new int[ Size2 ]; } ~CArrayDouble() { for( unsigned i = 0; i < m_Size1; ++i ) delete[] nTable[ i ]; delete[] nTable; } unsigned GetSize1() const { return m_Size1; } unsigned GetSize2() const { return m_Size2; } unsigned SetValue( unsigned index1, unsigned index2, int value ) { if( index1 >= m_Size1 || index2 >= m_Size2 ) return false; nTable[ index1 ][ index2 ] = value; } int ShowValue( unsigned index1, unsigned index2 ) { if( index1 >= m_Size1 || index2 >= m_Size2 ) return false; return nTable[ index1 ][ index2 ]; } bool SetSize( unsigned Size1, unsigned Size2 ) { int ** newTable = new int *[ Size1 ]; for( unsigned i = 0; i < Size1; ++i ) newTable[ i ] = new int[ Size2 ]; if( Size2 >= m_Size2 ) for( unsigned i = 0; i < m_Size1; ++i ) { memcpy( newTable[ i ], nTable[ i ], m_Size2 * sizeof( int ) ); delete[] nTable[ i ]; } else for( unsigned i = 0; i < m_Size1; ++i ) { memcpy( newTable[ i ], nTable[ i ], Size2 * sizeof( int ) ); delete[] nTable[ i ]; } if( Size1 >= m_Size1 ) { memcpy( newTable, nTable, m_Size1 * sizeof( int ) ); delete[] nTable; } else { memcpy( newTable, nTable, Size1 * sizeof( int ) ); delete[] nTable; } for( unsigned i = 0; i < Size1; ++i ) nTable[ i ] = newTable[ i ]; nTable = newTable; m_Size1 = Size1; m_Size2 = Size2; return true; } };
#endif
Używałem debugera, jednak wciąż nie wiem co robię źle. Prawdopodobnie nie umiejętnie posługuję się funkcją void * memcpy( void * dest, const void * src, size_t count ) Z góry dziękuję za pomoc, wskazówki, rady. |
|
RazzorFlame |
» 2013-07-18 22:05:44 Spróbuj może coś w tym stylu: void CArrayDouble::SetSize( int x, int y ) { int ** newTable; newTable = new int *[ x ]; for( int i = 0; i < x; i++ ) { newTable[ i ] = new int[ y ]; } for( int xx = 0; xx < x; xx++ ) { if( xx > SizeX ) break; for( int yy = 0; yy < y; yy++ ) { if( yy > SizeY ) break; newTable[ xx ][ yy ] = 0; } } for( int xx = 0; xx < x; xx++ ) { if( xx > SizeX ) break; for( int yy = 0; yy < y; yy++ ) { if( yy > SizeY ) break; newTable[ xx ][ yy ] = oldTable[ xx ][ yy ]; } } SizeX = x; SizeY = y; }
PS. Sory ze gotowcem ale nie potrafiłem wytłumaczyć. |
|
Bimbol Temat założony przez niniejszego użytkownika |
» 2013-07-19 13:14:33 Wolę użyć memcpy. W tym przykładzie również brakuje zwalniania pamięci. Czy ktoś ma jakieś inne sugestie? Trochę się z tym bawiłem, ale wciąż nic. Ciągle sypie się w tym samym momencie. main.cpp: #include "array.h"
using namespace std;
int main() { CArrayDouble Tab( 2, 2 ); Tab.SetSize( 6, 6 ); return 0; }
array.h: #ifndef ARRAY_H_INCLUDED #define ARRAY_H_INCLUDED
#include <iostream> #include <memory.h> #include <conio.h>
class CArrayDouble { private: int ** nTable; unsigned m_Size1; unsigned m_Size2; public: CArrayDouble( unsigned Size1, unsigned Size2 ) : m_Size1( Size1 ) , m_Size2( Size2 ) { nTable = new int *[ Size1 ]; for( unsigned i = 0; i < Size1; ++i ) nTable[ i ] = new int[ Size2 ]; } ~CArrayDouble() { for( unsigned i = 0; i < m_Size1; ++i ) delete[] nTable[ i ]; delete[] nTable; } bool SetSize( unsigned Size1, unsigned Size2 ) { if( Size1 <= m_Size1 || Size2 <= m_Size2 ) return false; int ** newTable = new int *[ Size1 ]; for( unsigned i = 0; i < Size1; ++i ) newTable[ i ] = new int[ Size2 ]; for( unsigned i = 0; i < m_Size1; ++i ) memcpy( newTable[ i ], nTable[ i ], m_Size2 * sizeof( int ) ); memcpy( newTable, nTable, m_Size1 * sizeof( int ) ); nTable = newTable; m_Size1 = Size1; m_Size2 = Size2; for( unsigned i = 0; i < Size1; ++i ) delete[] newTable[ i ]; delete[] newTable; return true; } };
#endif
W dekonstruktorze się sypie, dokładniej delete[] nTable; Wie ktoś w czym problem? EDIT. Poradziłem sobie. |
|
« 1 » |