[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 !!!