Sobre accesos a memoria dinamica.

Started by kim-elet-o, July 19, 2008, 12:04:39 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

kim-elet-o

Hola tengo una duda, y esta es la siguiente:

Tengo zona de memoria asignada mediante la funcion Alloc, y el tamaño de esta es variable que dependera de la cantidad de bytes que tenga cierto fichero.

Global
int TamVariable;
Pointer PuntMemo;

BEGIN
TamVariable = TamañoFichero("datos.dat"); // Se obtiene el tamaño del fichero en bytes.
PuntMemo = Alloc(TamVariable);                // Se reserva una zona de memoria dinamica de TamVariable bytes
CargaFichero("datos.dat",PuntMemo);         // Se carga el contenido del fichero en la zona de memoria dinamica.
END

La pregunta es la siguiente cuando accedemos a los datos memoria dinamica creada, se accede de la siguiente forma.
Dato = PuntMemo[N]; para leer y PuntMemo[n] = Dato; para escribir, pero tengo un pequeño problema, de este modo
leo y escribo valores integer, pero lo que a mi me interesa es leer y escribir bytes, hay alguna forma de hacerlo mediante asignacion directa (o cuasi directa)?, una forma de hacerlo que se ocurre, es leer y escribir integers en la variable, pero leyendo y escribiendo con mascaras de bits, los bytes que me interesan de esos integers, una cosa asi seria.

para leer:
Dato = PuntMemo[0];                      // para acceder a los 4 primero bytes, por que un integer esta compuesto de 4 bytes
Dato = (Dato BAND 000000FFh);        // Primer byte de la zona de memoria dinamica.
Dato = (Dato BAND 0000FF00h)>>8;   // Segundo byte de la zona de memoria dinamica.
Dato = (Dato BAND 00FF0000h)>>16; // Tercer byte de la zona de memoria dinamica.
Dato = (Dato BAND FF000000h)>>24; // Cuarto byte de la zona de memoria dinamica.
Dato = PuntMemo[1];                      // para acceder a los 4 siguientes bytes, por que un integer esta compuesto de 4 bytes 
Dato = (Dato BAND 000000FFh);        // Quinto byte de la zona de memoria dinamica.
Dato = (Dato BAND 0000FF00h)>>8;   // Sexto byte de la zona de memoria dinamica.
Dato = (Dato BAND 00FF0000h)>>16; // Septimo byte de la zona de memoria dinamica.
Dato = (Dato BAND FF000000h)>>24; // Octavo byte de la zona de memoria dinamica.
....
Claro asi no voy acceder a lo bruto, realizare una funcion de lectura y otra de escritura que calcule los Offsets de los bytes y los coloque en el lugar apropiado, pero si estas funciones se usan en un bucle pueden enlentecer un poco el programa y antes de seguir a delante quisiera saber si hay un metodo que sea mas rapido como una asignacion directa, no se si se me ha entendido bien lo que pregunto, de todos modos gracias de antemano.
|/
|\im-elet-o el yayo programador.

SplinterGU

#1
Y si probas declarando PuntMemo como "char pointer" o "char *" o "byte pointer" o "byte *"

Por otro lado, los punteros son apuntadores, asi que podes tambien tener otra variable de tipo "char *" (o cualquiera de los que te mencione arriba) y asignarle esta el valor de PuntMemo... por ejemplo asi...


char * pChar;

....

pChar = PuntMemo;

De aca en mas usas pChar para recorrer el area de datos...

Pero bueno, la primera creo que es la mas adecuada...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

kim-elet-o

Hmmmm como "char pointer" no se me habia ocurrido, y con "byte pointer" pensaba que definiendo el tipo de puntero a byte, asi solo podria acceder a un solo dato tipo byte, bueno cada dia no te iras a dormir sin saber una cosa mas, ya me parecia que si se podia, Bien!, ahora si que no tendre que poner en practica ese plan B, que no me era tan grato, jejejejejejeje, gracias de nuevo, voy a probar.

|/
|\im-elet-o el yayo programador.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2