Una de punteros y formatos negativos.

Started by Drumpi, November 05, 2008, 01:28:29 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Drumpi

Hola a todos:
Vengo porque me han surgido dos preguntas que, aunque sigo programando en Fenix, la idea es luego portarlo a bennu... por eso, y porque Splinter anda más por aquí que por divsite ^^U

Bien, la primera puede ser un poco tonta, pero no me fio de la gestion de memoria ¿Habría algún problema por usar realloc en un bucle sin frame, allocando 1 byte en cada iteración, con un número bastante alto de repeticiones? La idea básica es copiar un fichero de texto, byte a byte, sin conocer previamente el tamaño del fichero, en memoria, usando un array basado en alloc/realloc.
Si existe otra forma más elegante/correcta, me gustaría conocerla.

La segunda ya es por flojera, más que nada (y que ando un poco liado por las clases) ¿Cómo guarda Fenix/Bennu los bytes cuando uso un fwrite con un int o una word? y más importante ¿qué formato usa para números negativos? bit de signo, complemento a 1, complemento a 2, alineacion interplatanaria...

Gracias ^^U
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

En bennu...

No hay problema con la gestion de memoria, podes hacer los realloc que gustes, pero eso de leer byte a byte no es elegante, y mucho menos, es performante... Vos podes leer de a bloques y las funciones de lectura te diran cuantos elementos pudieron leer... esa es la forma correcta y la idea es que uses un buffer de un tamaño considerable, digamos 65k o puede ser mucho mas grande, pero con 65k puede ir bastante bien...

Los guarda como lo que son, pero con byteorder intel, yo hubiese "big endian", pero bueno, si lo cambio se pierde compatibilidad con todo el mundo conocido...

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

kim-elet-o

De hecho ese sistema lo uso yo, cuando cargo la lista enlazada de los pseudocodigos de los enemigos que usa mi motor de enemigos, la causa de hacerlo asi, es que cada enemigo tiene su programa en pseudocodigo y este es de longitud variable.

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

SplinterGU

Mi sugerencia es no usar realloc en momentos de necesitar velocidad... ya que realloc no solo aloca un nuevo espacio de memoria, sino que copia el contenido del buffer anterior al nuevo alocado...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

No, si la idea es guardar cierta info en tamaños de byte, word e int segun necesidad, pero a la hora de cargarlos, los meto byte a byte en memoria, sin saber en cada momento lo que estoy leyendo porque no hago una interpretación en tiempo real. Y cuando luego tenga que leer un int en mi "byte pointer array
  • " deberé coger 4 bytes e interpretar el orden y el signo, y no sabía la forma concreta usada en bennu para guardar los datos. No se si me explico.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

SplinterGU

Si usas read sobre una estructura o sobre una variable con int o int, Bennu ya interpreta el orden y te lo deja en el orden requerido por el procesador en el que estas corriendo...
Ahora si usas un byte pointer array, entonces tenes que hacer vos el orderbyte... pero para eso, ya tengo preparada una libsock nueva, que tengo que subir con funciones que sirven para esto... y aunque no uses socket te pueden servir...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

kim-elet-o

Bien, bien, rebien, cuando hallas añadido esas funciones, podre mejorar mis sistemas de carga de ficheros, como diria el macario ese del joseluis moreno "que contento questoyyyyy".

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

SplinterGU

pero me confundi, porque bennu/fenix guardan los datos en littleendian order, y las funciones hton y ntoh convierten de littleendian a bigendian, en base al procesador donde estan corriendo... o sea, siempre devuelven bigendian, y las de bennu/fenix el resultado es littleendian, asi que no sirve...

para que quede claro...

save -> disco -> load

Bennu/Fenix
memoria -> littleendian -> memoria

funciones socket
memoria -> bigendian -> memoria
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

actualmente las funciones de grabacion y lectura, guardan u leen correctamente si usas variables
Download Lastest BennuGD Release: http://www.bennugd.org/node/2