[Kde-devel-es] Array de 3 dimensiones

Miguel kde-devel-es@mail.kde.org
Wed, 5 Feb 2003 00:17:50 +0100


Hi,

> Un int usa 4 bytes, de modo que tu matriz est=E1 usando 146880 bytes (a=
prox.
> 143 KB). Un char s=F3lo usa 1 byte, con lo que tu matriz usar=EDa 36720=
 bytes
> (algo menos de 36 KB), o sea 4 veces menos que antes. Si usar un char p=
ara
> almacenar n=FAmeros te parece confuso, cr=E9ate tu propio tipo de datos=
=2E Por
> ejemplo:

Realmente usarndo 1 byte para cada elemento tambien desperdiciamos bastan=
te
espacio, si tenemos en cuenta que una variable  que puede tener 3 valores=
=20
distintos cabe en 2 bits, en un byte se pueden almacenar 4 de esas variab=
les.=20
Pudiendo reducir el tama=F1o de la tabla  a 8179 bytes.

Para ello habra que trabajar con decalados y mascaras de bits para poder =
meter=20
16 valores de 2 bits cada uno en un tipo int.
Se puede simplificar un poco el tema a costa de perder un poco de velocid=
ad
utilizando la clase QBitArray de las qt que nos permiten trabajar con bit=
s=20
individuales de modo mas sencillo.=20
Podriamos definir una clase como la siguiente para trabajar
con este array (ojo el codigo esta sin probar asi que puede tener bugs,
seguramente no compilara, y algunas partes se pueden optimizar algo mas,=20
aunque lo importante  es pillar la idea):

---------------------8<---------------------8<--------------------8<-----=
-------

#include <qbitarray.h>

class DxccArray
{
  private:

     QBitArray data;

     int npaises,nbandas,nmodos;

     inline int getIndex(int pais,int banda,int modo)=20
     { return (pais*(nbandas*nmodos)+banda*nmodos+modo)*2; }

  public:

     Enum Status { Status1=3D0, Status2=3D1, Status3=3D2 };

     DxccArray(int paises,int bandas,int modos);
     ~DxccArray();

     void   setStatus(int pais,int banda,int modo,Status estado);
     Status getStatus(int pais,int banda,int modo);
};

DxccArray::DxccArray(int paises,int bandas,int modos);
{
 npaises=3D paises;
 nbandas=3D bandas;
 nmodos =3D modos;
 data.resize( paises*bandas*modos*2 );
}

DxccArray::~DxccArray()
{}

void DxccArray::setStatus(int pais,int banda,int modo,int estado)
{
 int i     =3D getIndex(pais,banda,modo);
 data[i  ] =3D (bool)(estado & 1);
 data[i+1] =3D (bool)(estado & 2);
}

Status DxccArray::getStatus(int pais,int banda,int modo)
{
 int i =3D getIndex(pais,banda,modo);
 return (int)data[i] + (((int)data[i+1])<<1);
}
---------------------8<---------------------8<--------------------8<-----=
-------

Salud2 !!!