Pregunta sobre punteros

Previous topic - Next topic

mentalthink

Hola bueno hoy parece que estoy un poco por dar la tabarra , sorry :(.

Bien tengo una duda desde hace muchísimo tiempo, que es referente a los punteros, aunque sé que lo que són, no entiendo su utilidad, y Glbasic, me parece que si que puede hacer uso de ellos,  leyendo un poco y una vez un programador profesional, me pregunto lo primero de todo,  si Glbasic tenia punteros, pues supongo que debe ser bastante útil.

Bien... para que sirven, o qué puedo hacer con ellos?¿, lo más básico, ya que supongo que abarcaran un amplio abanico de posibilidades y sería bastante complicado explicarlas todas por aquí

De nuevo gracias,
Iván J.

OscarBraindeaD

Hola mentalthink.
Aunque no soy un experto, te diré para qué los utilizaba yo.
Como sabes, la variable puntero contiene una dirección de memoria de "algo". Yo, las veces que los he usado (en los tiempos del DOS y programando para la gameboy, por ejemplo) los usaba para saber en qué posición de memoria empezaba la memoria de video de la VGA o de la pantalla de la gameboy. Así, cuando querías escribir un píxel o leer un píxel, sabías que era desde la posición apuntada por el puntero más el desplazamiento x e y del píxel en ella. No sé si me explico. Creo recordar que también se solía tener un puntero que apuntaba al backbuffer y otro al front buffer para poder luego hacer el cambio de búferes (equivalente a showscreen de glbasic), para ir recorriendo los enemigos e ir procesándolos mediante una tabla de punteros... Por ejemplo cuando java te devuelve un identificador al crear un objeto, me imagino que internamente será un puntero a esa instancia... el propio self seguro que es un puntero a sí mismo... para todo eso se pueden usar y mil cosas que me dejo por mi desconocimiento, porque, como te digo, ni mucho menos soy un entendido en el tema e igual he puesto algo incorrecto.

Buff, menudo rollo te he largado...
Salud

mentalthink

No OscarbraindDead la verdad es que me has aclarado en cierta medida el tema, lo que pasa que es como bien dices, se podrá utilizar para tantas cosas que hasta que yo mismo les encuentre una utilidad, pues creo que pasará tiempo.

Lo del tema que sabes la posición real, o sea la parte en dónde está del integrado físico si lo sabía, y me parece muy interesante, pero quizás y desde mi punto de vista de estudiante de electrónica, quizás tiene más sentido en cosas de programación de hardware, que para el desarrollo de juegos, no se, como digo es una cosa que veo que hablan libros y tal... pero por ejemplo ya que estamos, y pérdona la pregunta porque seguro que tiene una lógica y su razonamiento, pero son cosas que como no he tocado en mi vida, se me "escapan".

Cuando dices que dibujas un Sprite, y sabes en dónde empieza la memoria de video... bien que finalidad tiene, poder ir controlando lo que queda de memoria?¿, porque una questión que siempre me viene a la cabeza llamar directamente a un puntero es más rapido que el acceso tradicional al array?¿.

Sobre el tema que me dices que me has contado un rollo en absuluto, te lo agradezco, porque lo poco que toque de C en la FP hace ya muchísimos años dejaba mucho que desear, y son cosas que aunque no las vaya a utilizar, digamos en un futuro inmediato, si que me gusta saber más o menos lo que és. De hecho os pido disculpas por haber abierto 3 hilos preguntando cosas de programación, ya que aquí estamos por cosas de Glbasic y no para que me enseñe la gente cosas que seguramente podría buscar en los libros e internet, pero como comento, a veces hay cosas que no las pillo ni "pa tras" como el tema de las clases instancias y tal, lo veo muy abstracto... estoy acostumbrado a que una instancia sea una esfera o lo que sea en 3D, pero con código, ya me vuelvo algo "majara".

OscarBraindDead, de nuevo gracias, por la formidable explicación.

Un saludo,
Iván J.

msx

Los punteros "apuntan" a una direccion de memoria. Si la dirección es RAM equivale a definir una variable pero en lugar de hacerlo por un nombre se hace por una dirección. Es muy útil cuando programas microcontroladores en ensamblador (ya que estudias electrónica), de esta forma guardamos los valores en determinadas direcciones de memoria RAM y las operaciones se hacer modificando esa dirección de RAM. En lenguajes de alto nivel te puede servir precisamente para escribir en direcciones especificas como pudiera ser la VRAM.

Seguramente alguien te lo podrá aclarar mejor, pero para que te hagas una idea.

mentalthink

Gracias MSX, sobre lo de estudiar electrónica hace más de 13 años que me saqué la FP, y como te comento lo que me enseñaron de poco me sirvio, aunque bueno para cosillas del Spectrum y demás Ordenadores a veces va bien.

Es lo que comentaba que creo que en programación, más orientada a cosas de electrónica si que puede ser interesante, pero en Glbasic pues la verdad yo no sé a que podría aplicarlo.

Supongo que es algo parecido al tema de JP, ADD y estas cosas que se hacian con los 8 bits, y bueno supongo que con algun PIC de electrónica se seguirá haciendo no se...

Gracias de nuevo, por la ayuda.

OscarBraindeaD

Quote from: mentalthink on 2011-Aug-13
Cuando dices que dibujas un Sprite, y sabes en dónde empieza la memoria de video... bien que finalidad tiene, poder ir controlando lo que queda de memoria?¿, porque una questión que siempre me viene a la cabeza llamar directamente a un puntero es más rapido que el acceso tradicional al array?¿.

No, la finalidad es hacer una copia en la memoria de video del sprite para que éste se dibuje en la posición que queremos... para eso, debemos saber dónde empieza la memoria de video y cuánto tenemos que desplazarnos en ella para "volcar" la imagen del sprite, los píxeles, etc.
El uso de punteros para acceder a una tabla, por ejemplo, es más rápido porque no hace comprobaciones... En la mayoría de los lenguajes (creo que C no lo hace) si le pides la posición 23 de una tabla de 22 elementos, te devolverá un error, ya que comprueba qué dimensiones tiene la tabla. Si accedes mediante un puntero y te pasas, generalmente no te devolverá un error, te dará información no válida (lo que haya en ese momento en la memoria)...

Más o menos, espero haberme explicado y no haber dicho muchas burradas, llevo muchos años sin tocar los punteros, ni hacer nada en DOS y, cuando lo hacía, tampoco era un gurú precisamente... lo mío era más prueba y error, que otra cosa :)

mentalthink

Gracias de nuevo OscarBraindeaD, me va quedando más claro el tema.

:booze: :booze: :enc: :enc:

hardyx

Hola, los punteros se usan C por ejemplo como índices rápidos, me explico. En vez de recorrer una matriz con un indice como matriz(i) se usa un puntero para indicar el elemento actual, este es mucho más rápido para la máquina. Porque para indexar hay que multiplicar y el puntero es una suma. Pero vamos, la instrucción FOREACH de GLBASIC ya te hace eso internamente con un puntero (o referencia).

También se usan los punteros para asignar objetos (tipos) dinámicos, de tal manera que se pueden luego liberar. GLBasic usa punteros internamente para los arrays por ejemplo, las instrucciones DIMPUSH y DIMDEL permiten crear elementos de forma dinámica (sin tamaño fijo). Otro uso en C es permitir devolver valores, lo que en GLBASIC es la instrucción BYREF.

El lenguaje GLBASIC no tiene punteros (sí que los tienes con C INLINE), pero internamente los usa ocultado la dificultad al programador, y la mayoría de programas no los necesitarás. Si los necesitas para algo complejo, como llamadas externas puedes usarlos con INLINE o con BYREF. Por ejemplo, se usan en Box2d, en OpenGL o en Mappy.

Espero haberlo explicado bien.
Un saludo

mentalthink

Quote
Espero haberlo explicado bien.

Pués Hardyx... Super bien!!!. :nw: :nw:

Gracias!!!.