Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Tablica Dwuwymiarowa jako Klasa, przechowująca elementy w ciągłym obszarze pamięci.

Ostatnio zmodyfikowano 2013-07-21 11:04
Autor Wiadomość
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:
C/C++
#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:
C/C++
#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:
    // Konstruktor
    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 ];
       
    }
    // Dekonstruktor
    ~CIntArrayDouble()
    {
        for( unsigned i = 0; i < m_Index1; ++i )
             delete[] m_Table[ i ];
       
        delete[] m_Table;
    }
    // Metody
    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 )
    {
        // Tworzymy tymczasowa tablice
        int ** Array = new int *[ Index1 ];
        for( unsigned i = 0; i < Index1; ++i )
             Array[ i ] = new int[ Index2 ];
       
        // Kopiowanie oraz kasowanie
        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;
       
        // Ponownie przypisanie
        m_Table = Array;
       
        m_Index1 = Index1;
        m_Index2 = Index2;
       
    }
};

#endif // ARRAY_H_INCLUDED
P-88455
DejaVu
» 2013-07-21 00:11:53
Wystarczy zaalokować pamięć:
C/C++
int * pTablica = new[ m_rozmiarY * m_rozmiarX ];
i potem napisać:
C/C++
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 ) << " ";

P-88469
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.
P-88478
« 1 »
  Strona 1 z 1