Muy buen dia estoy buscando optimizar el tamaño de una estructura dada.
Habia visto que es posible especificar el tamaño de una variable a nivel de bits.
struct nodo {
int id;
unsigned char tabla[4][4];
unsigned char x,y;
struct nodo *aristas[4];
};
Quiero optimizar las variables tabla, x é y
Las variables solo tiene valores del 0 al 15, con lo cual 4 bits serian suficientes.
Habia visto que se puede especificar el tamaño de la variable ejemplo:
struct nodo {
int id;
unsigned char tabla[4][4];
unsigned char x:4;
unsigned char y:4;
struct nodo *aristas[4];
};
Pero no se hacerlo para la variable tabla.
Saludos!
Con arrays no se puede.
Sin embargo, si tienes un tabla[4][4], y quieres que sea cada uno de 1 bit, por ejemplo, te sirve poner un uint16_t, y acceder con operadores de bit.
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t 2 bytes
PD: Cual es el objetivo de optimizar el struct?
Saludos....
Cita de: crack81 en 22 Julio 2016, 19:30 PM
Creo que seria mejor un uint8_t ya que este vale 1 byte y el uint16_t 2 bytes
Si es [4][4], son 16 bits, 2 bytes
Cita de: crack81 en 22 Julio 2016, 19:30 PM
PD: Cual es el objetivo de optimizar el struct?
El objetivo es ahorrar espacio para guardar la tabla en archivos, el detalle es que en este punto el programa sigue generando Nodos y actualmente lleva mas de 7.8 Millones de Nodos
Cuenta, 16 bytes por 7.8 Millones en un archivo son 124 MB por lo cual poder quitarle la mitad del peso se me haria fantastico, ya que en este punto desconozco cuantos nodos mas se valla a generar.
ivancea96, creo que voy a tener una estructura adicional asi como lo comentas, y calcular esa estructura con operaciones de bits y Guardar el resultado en una sola variable de 64 bits.
Lo que seria un unsgined long long
Saludos!
Si lo resuelves el problema estaría genial que publicaras como lo hiciste
Saludos...
#include<stdio.h>
struct nodo {
int id;
unsigned char tabla[4][4];
unsigned char x,y;
struct nodo *aristas[4];
};
int main() {
int i = 0,j;
struct nodo a;
unsigned long long int c = 0;
while(i < 4) {
j = 0;
while(j < 4) {
a.tabla[i][j] = 16;
c = c<<4;
c += a.tabla[i][j];
j++;
}
i++;
}
printf("%llu",c);
}
Pues el ejemplo asi quedo, se termina guardando todo el arreglo en una sola variable de 64bits y simplemente me quedaría usar fwrite para guardar la variable en archivo. Y aplicaría el método inverso para devolverla a una tabla.
Saludos!
Pues resulta que esa aproximacion que publique, ya implementada es muy lentaaaa :-\
Tendre que o bien conformarme con la estructura original o en su defecto reprogramar la funcion que crea los nodos para que desde el principio se encuentren "comprimidos" en memoria la informacion deseada.
Saludos
Lo que te comentaba, es que en vez de mantener tu tabla de 4x4, pongas directamente el uint64_t y trabajes con él. Luego, basta hacer un par de funciones o defines para acceder a los datos :o
Voy a implementarlo asi como comentas.
Por cierto en este punto ya van 16.8 Millones De Nodos en el Grafo y en el Arbol ;-) ;-) ;-) y el archivo pesa sobre 320 MB.
Saludos
He estado un poco desconectado. ¿De que va tu programa?
Es bueno verte por aqui ;D
Es parte del Juego del imposible
http://foro.elhacker.net/programacion_cc/iquestimposible_juego_de_rompecabezas_imposible-t455410.0.html
Propuse que se creara un grafo para ver todas las posibilidades.
Y tal vez encontar la menor combinación de teclas para llegar de una configuracion a otra usando dijsktra
El programa actual ya funciona muy bien para hacer el grafo me auxlio de una arreglo y un arbol.
El arreglo tiene una lista de todos los nodos del grafo y el arbol me ayuda a buscar rapidamente si alguna conbinacion ya existe o no.
El detalle que quiero optimizar la estructura para que no ocupe tanto espació en archivo ni en RAM
Saludos