Más dudas existenciales

Started by HaCkZJuaNN, October 07, 2009, 07:52:53 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

HaCkZJuaNN

Pues me salen más dudas existenciales que como no funcionen me pueden putear de arriba a abajo.

De nuevo creo que lo tengo bien, pero más me vale asegurarme.

Si yo declaro un puntero de la siguiente manera:

declare function f(parametros...)

private
    tipo_definido pointer p_var1;
end
end

y luegoo hago, dentro de la función:

p_var1 = alloc(sizeof(tipo_definido));

o para el caso, lo que es lo mismo:

p_var1 = alloc(n*sizeof(tipo_definido));

y luego cojo p_res que está también definida como tipo_definido pointer, pero que no es privada al proceso, y hago:

p_res = p_var1;

El valor que hay en la dirección de memoria a donde apuntan p_res y p_var1, se evapora cuando la función termina??(por aquello de que al terminar, las funciones liberan sus variables privadas, pero claro, lo que tendría sentido es que liberara el propio puntero p_var1 y no el punto a dónde este apunta; la duda me entra porque lo he allocado DENTRO de la función, es una dirección de memoria creada desde dentro de la función).

Probablemente le estoy dando demasiadas vueltas y es como me estoy imaginando...

y si esto es así, entiendo que la única forma de liberar direcciones de memoria reservadas con "alloc" es con "free", no?

Gracias y un saludo.

laghengar

Yo no entiendo lo de "tipo_definido pointer" pensaba que no se podía juntar, ya que no se puede hacer "byte pointer", que yo sepa. A lo mejor te lo ha interpretado como una variable que guarda una dirección de memoria, y en la asignación ha hecho que p_res quede vinculada a p_var. Me aventuro a decir esto porque no lo entiendo, a ver si con alguna aclaración que venga después me entero.

¿Serviría quitando tipo_definido?
!!!Blender Blender Blender yuhuuuuuuu¡¡¡ novato o_O

HaCkZJuaNN

Un puntero a un tipo definido sí funciona... Lo llevo usando desde siempre. Tiene que ser así porque sino no puedo acceder a las sub-variables de esa variable de tipo definido desde el puntero, el programa no entiende "a qué me refiero", porque no sabe qué tipo de variable es. Supongo que lo que guarda el puntero es la dirección de memoria al primer byte de la variable de tipo definido. Mi pregunta era si al terminar la función se borra el contenido de la variable entera que he allocado en la función o solamente el del puntero.

Drumpi

Creo recordar (punteros he usado pocos, pero creo que era así) que al terminar tu función F desaparece la variable p_var1, pero no la memoria reservada, por lo que si no la apuntas con otro puntero externo (como haces tu o usando return), esa memoria queda residente en la RAM, ocupando espacio y sin forma de volver a saber su dirección.
O sea, que desaparece p_var1 pero no el contenido.
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

como dice drumpi es correcto, lo alocado con alloc o malloc, no se libera al morir la funcion/proceso, es la idea de usar esta funcion del modulo de memoria... solo se libera con free...

pero tenes que tener en cuenta que cuando hagas el free toda referencia (variable) que apunte a esta area liberada sera invalida... si la usas se te caera el programa...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Yo corroboro lo que dice Splinter, después de mi visor 3D creo que entiendo cualquier cosa relacionada con punteros en Bennu xD

Y tengo que añadir una cosita.

En cuanto a los punteros a tipos_definidos como:

PRIVATE
   tipo_definido POINTER mi_puntero;

Tuve una estructura de datos que era un grafo. Quiero decir, un puntero tipoA tenía un campo que era otro puntero tipoB, y a su vez el anterior puntero tipoB tenía un campo que era tipoA. En el primer tipoA tuve que especificar el puntero al tipoB como POINTER sin indicar el tipo, ya que el compilador me indicaba que no estaba declarado aún...

Pero pude apuntar correctamente a la estructura de datos tipoB con ese POINTER (Menos mal...).

Mi conclusión: Con malloc haces que el POINTER (Sin tipo definido) apunte a una zona de memoria del tamaño de tipoB (sizeof) y al acceder a los campos se posiciona en ello correctamente y no da ningún problema. En su día PiXeL me dio la idea de que un POINTER puede apuntar a cualquier cosa, aunque si pones el tipo_definido mejor, yo lo pongo siempre que es posible, por legibilidad.
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

HaCkZJuaNN

Relacionado con esto, tengo más dudas.

Siento no postear en otras secciones y tal :\ pero estoy metido en muchas cosas y cuando miro los threads no veo nada sobre lo que me apetezca hablar(no porque los temas sean aburridos, sino porque yo soy muy particular con lo que me gusta xD).

En cualquier caso, necesito saber que lo estoy haciendo 100% bien porque el follón de punteros y punteros y tipos definidos que me estoy armando es muy grande y no puede fallar por una misconcepción de la programación. Cuando yo hago como en el primer post y defino un puntero a un tipo_definido y luego alloco más de una variable, por ejemplo:

p_var1 = alloc(5*sizeof(tipo_definido));

Entonces, luego puedo acceder a 5 secciones de memoria con tamaño de tipo_definido haciendo p_var1[0..4] verdad??? Quiero decir, el hecho de definirlo como tipo_definido hace que al utilizarlo como matriz los saltos sean del tamaño de tipo_definido, no?

Windgate

Es algo que no he probado nunca KaCkZJuaNN pero en C era así y "espero" que en Bennu también... Creo que lo mejor sería que hicieses un programa de prueba hiper-mega-simple que añada unos valores a ese vector que has alojado en memoria y luego los intentes imprimir.

Mantengo la atención sobre este hilo ya que es una de esas cosas de Bennu que todavía desconozco, siempre queda algún agujero con el vasto mundo Bennusiano ;)
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

deberia ser correcto... no funciona?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Si que funciona, si, y puedo poner de ejemplo mi nuevo, fabuloso, etc etc motor de scroll tileado.
En concreto los ficheros tmapa.h y tmapa.inc, ya que en el tipo tmapa hay punteros a byte, word e int, y el acceso mediante la función obtener_tile usa la misma posición independientemente del tipo de variable al que apunta.

Como mola tener código con el que argumentar ;D
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)

Windgate

Gran noticia saber a priori que funciona, no lo he usado nunca, pero me gustaría poder contar con el recurso.

Por ejemplo hoy mismo estaba creando una lista dinámica con la que poder acceder fácilmente al identificador de modelo asociado a un proceso en Bennu3D y he tenido un error extraño al utilizar POINTER ??? (Lo contaré en otro hilo) así que quizás me sea útil a corto plazo usar vectores "dinámicos" del tipo que estamos hablando aquí.
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

HaCkZJuaNN

Bueno lo cierto es que no es facilísimo de probar, y con estas cosas nunca estoy seguro de que las pruebas que hago sean correctas(esté accediendo a las zonas de memoria correctas), y además quería estar segurisísisisimo porque si esto no funciona puedo decir adios al 95% de lo que llevo programado en este proyecto, que ya va siendo bastante largo.