Uso de punteros como array dinámico para novatos.

Started by Drumpi, December 02, 2009, 12:51:50 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

DjSonyk

¿Eso quiere decir que la carga de los datos a la memoria dinamica la hago bien?
En lo otro supones mal ^^ ,con una variable privada hago; encontrado=celdas[contador];say(encontrado); :(

SplinterGU

A ver... no me lei todo, disculpas, pero voy a comentar algunas cosas que lei...

1) los realloc son costosisimos en Windows, en unix son una seda... la cosa es que la cagada de windows, para hacer realloc, siempre asigna un nuevo area de memoria... en los unix normalmente expande el area ya asignada, con lo que no asigna un nuevo espacio ni copia la data vieja sobre la nueva...

2) Como que el realloc se come las ultimas posiciones??? eso no puede ser... o quizas no te entendi que queres decir...

3) En bennu no hay garbage... si alocas, tenes que desalocar... cuidado!

4) si haces un alloc no podes grabar eso con las save comunes, no podes guardar dinamicos con save, fwrite o fread... porque lo que estas guardando/recuperando son punteros... tenes que usar el modo extendido de fwrite/fread... busca las funciones en este foro, esta el help descripto...

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

Windgate

Gran aporte en el punto 4 Splinter, ahora entiendo, si haces vectores a través de un puntero no guardas el vector, guardas el puntero.

Qué peculiar es Bennu, es peculiar, como nosotros xD
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

DjSonyk

Si eso es lo que creo que hacia guardar punteros...... estado buscando no encuentro nada Splinter al menos el estendido de Fwrite/Fread ...
Bueno que se le va hacer....

Drumpi

DjSonyk: Haz lo que te dije: del puntero lo guardas en una variable, y luego de esa al fichero... o usa las funciones extendidas, pero esas no las conozco. Vamos, que en la carga deberías haber hecho algo así:

TYPE Celda
   INT X,Y,Grafico;
END
Celda POINTER Celdas;
abrir fichero

Celdas=Alloc(3072*sizeof(Celdas));
id_fich=FOPEN("dat.dat",O_READ);
FOR (contador10=0;contador10<=3072;contador10++)
   Fread(id_fich, Celda);
   celdas[contador10]=celda;

END
FCLOSE(id_fich);

Y no se si tendrías que ir campo por campo, pero no debería ser necesario.

Splinter: 2) me refiero a que si haces un realloc con menos memoria que la que tenías reservada antes, lo lógico es liberar las últimas posiciones, perdiéndose esos datos. Si luego Windows no es lógico, no es problema mio ;D

PD: el foro no me deja responder a este hilo con la respuesta rápida, que raro.
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)

DjSonyk

¡¡¡Drumpi muchas gracias!!! ,lo haré pero ya mas adelante,sigo con el proyecto,que ademas devo acabar uno que le pormeti a Delso y seguir con mi Remake de Army.....ah he intentar portar el ejemplo de lista para Wind...Pero primero quiero dejar el editor sobre todo para los que estais en el concurso,os centreis en el codigo y no donde teneis que poner cada cosa dentro del nivel....aun asi cierto es que & devuelve un puntero y * devuelve el contenido del puntero al menos en C.

Prg

mi dolor de cabeza... arrays dinámicos  :D

karma ++, :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

SplinterGU

Quote from: Windgate on December 03, 2009, 03:07:46 AM
Gran aporte en el punto 4 Splinter, ahora entiendo, si haces vectores a través de un puntero no guardas el vector, guardas el puntero.

Qué peculiar es Bennu, es peculiar, como nosotros xD

no es nada peculiar de bennu, es algo logico... como lo puedo explicar sin re-explicar lo obvio? cuando uno crea un puntero, un puntero es un indicador a una direccion, ningun lenguaje por medio de un puntero, no puede saber cuanta memoria tiene el area de memoria que apunta el puntero, ademas el puntero no esta asociado a ningun area de memoria... es simplemente un puntero, un señalador que puede ser cambiado su valor, sin que por eso se libre memoria ni se afecte la memoria alocado... no se como explicarlo de otra forma...

Quote from: Drumpi on December 03, 2009, 02:38:12 PM
DjSonyk: Haz lo que te dije: del puntero lo guardas en una variable, y luego de esa al fichero... o usa las funciones extendidas, pero esas no las conozco. Vamos, que en la carga deberías haber hecho algo así:

TYPE Celda
   INT X,Y,Grafico;
END
Celda POINTER Celdas;
abrir fichero

Celdas=Alloc(3072*sizeof(Celdas));
id_fich=FOPEN("dat.dat",O_READ);
FOR (contador10=0;contador10<=3072;contador10++)
   Fread(id_fich, Celda);
   celdas[contador10]=celda;

END
FCLOSE(id_fich);

Y no se si tendrías que ir campo por campo, pero no debería ser necesario.

Splinter: 2) me refiero a que si haces un realloc con menos memoria que la que tenías reservada antes, lo lógico es liberar las últimas posiciones, perdiéndose esos datos. Si luego Windows no es lógico, no es problema mio ;D

PD: el foro no me deja responder a este hilo con la respuesta rápida, que raro.

ese ejemplo tampoco va a funcionar, estas usando punteros.

que el realloc achique la memoria y elimine los datos del final, no es ningun defecto ni problema...

Quote from: DjSonyk on December 03, 2009, 01:54:35 PM
estado buscando no encuentro nada Splinter al menos el estendido de Fwrite/Fread ...

http://forum.bennugd.org/index.php?topic=102.msg6312#msg6312

http://forum.bennugd.org/index.php?topic=102.msg6314#msg6314

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

Drumpi

Cierto, confundí tipo con variable ^^U

TYPE Celda
   INT X,Y,Grafico;
END
celda dato_celda;
Celda POINTER Celdas;
abrir fichero

Celdas=Alloc(3072*sizeof(Celda));
id_fich=FOPEN("dat.dat",O_READ);
FOR (contador10=0;contador10<=3072;contador10++)
   Fread(id_fich, dato_celda);
   celdas[contador10]=dato_celda;
END
FCLOSE(id_fich);

Y yo aun despierto ;D
PD: sigo sin poder responder a ESTE HILO con el cuadro de respuesta rápida.
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)

Sandman

No extra variable needed:

TYPE Celda
   INT X,Y,Grafico;
END
Celda POINTER Celdas;

//abrir fichero
Celdas=Alloc(3072*sizeof(Celda));
id_fich=FOPEN("dat.dat",O_READ);
FOR (contador10=0;contador10<=3072;contador10++)
   Fread(id_fich, celdas[contador10]);
END
FCLOSE(id_fich);
-- Sandman

SplinterGU

oh, yes, you are right... the compiler know sizeof "celdas[]"... ;)

In theory this must works... if don't work then we have a problem...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Sandman

Actually, there's an error. There are 3072 Celda's allocated, but 3073 are loaded. So, one of them needs to be fixed.
-- Sandman

Windgate

Oh, I remember that arrays in Bennu has celdas from 0 to N, this is:

int my_array [ 1024 ]

Has elements from 0 to 1024, so 1025 elements.

Maybe with arrays is the same... ??? Although it is weird, yes...
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

Quote from: Sandman on December 04, 2009, 01:33:51 PM
Actually, there's an error. There are 3072 Celda's allocated, but 3073 are loaded. So, one of them needs to be fixed.

contador10  <"="  3072

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

DjSonyk