Llevo unos días metido en estos fregados de trabajar con datos binarios y al hacer diversas pruebas he llegado a la conclusión de que de alguna manera la aseveración de que en gambas no se pueden pasar variabless por referencia no es correcta.
Citar:
Diferencias con VB
Pues no es cierto. De hecho estoy examinando las implicaciones pero ciertamente se pueden pasar variables por referencia aunque de una forma un poco mas torpe. En Visual Basic existían los poeradores byval y byref para estas cosas. En gambas no funciona así. En gambas podemos pasar el puntero de una variable.
Que es un puntero
Cuando yo creo una determinada variable lo que estoy haciendo es asignar un determinado espacio en la memoria para ello. Por ejemplo una variable de tipo Integer ocupa cuatro bits. Eso quiere decir que si yo dimensiono una variable de tipo entero lo que estoy haciendo es RESERVAR cuatro bytes de la memoria del ordenador para eso. Cuando yo asigno un valor a esa variable lo que estoy haciendo es meter en esos cuatro bytes de memoria el valor asignado.
Por tanto si en vez de mirar lo que hay en la variable miro lo que hay en su memoria estoy mirando lo mismo.
Un puntero es una dirección de memoria en la que está algo. Un puntero a una variable entera lo que hará es darme la dirección de memoria donde está la memoria reservada de una variable. Por eso si yo cambio ese valor en realidad estoy cambiando el valor de la variable.
Trabajar con punteros
Un puntero es un stream. Se utilizan las ordenes read y write igual que con los streams para leer su valor o para cambiarlo.
Con esto lo que he hecho es dimensionar una variable Numero de tipo entero (4 bytes)
Dimensionar una variable puntero y asignarle 4 bytes. Ahora tengo ocupados 12 bytes, 4 en una variable entera con el valor 5000, 4 en una variable entera sin valor y cuatro en un puntero que actualmente no tiene nada
write #Puntero,Numero 'meter en esos cuatro bytes reservados Numero.
Con esto meto el valor 5000 en esos cuatro bytes reservados
read #Puntero,OtroNumero
Con esto he metido el valor que haya en los cuatro bytes del puntero en la variable OtroNumero. Ahora Otronúmero vale 5000.
free(puntero)
Con esto libero los cuatro bytes ocupados.
Con esto tenemos entendido como se usan. Ahora bien ese uso concreto quizá sirve para entender como funcionan, pero no es muy práctico. Acabamos antes haciendo OtroNumero=Numero que creando cuatro bytes en memoria, pasando de Numero a esos bytes, luego pasando esa memoria a OtroNumero y luego borrando la memoria. Ahora demos un paso mas:
En gambas 3.0 existirá un nuevo operador VarPtr que asigna a un puntero la dirección de una variable.
Dim Puntero as pointer, Numero as integer=5000, OtroNumero as integer
antes hice puntero=alloc(4) con lo que reservaba 4 bytes nuevos adicionales a los ya reservados para Numero y OtroNumero.
Puntero=varptr(Numero
Con esto en cambio lo que hago es que puntero apunte a Numero. No son otros cuatro bytes, son los mismos cuatro bytes. El valor que hay en Numero es igual al valor que hay en los cuatro bytes donde apunte Puntero.
Ahora yo podría hacer
read #Puntero,OtroNumero
Esto mete en OtroNumero el valor que haya en la memoria a la que apunta puntero y que es 5000 por lo que es sinónimo a esto.
OtroNumero=Numero
¿Para qué usar punteros?
Pues por ejemplo no es útil para asignar valores de una variable a otra porque podemos asignar directamente Numero a OtroNumero sin necesidad de todo eso.
La razón es doble: por un lado si queremos pasar parámetros a aplicaciones en otros lenguajes el camino correcto será pasarles la dirección de memoria donde está el valor que quiero pasar. Es decir, pasar parámetros por valor o por referencia a otra aplicación no gambas.
La otra razón es pasar valores por referencia de una función a otra. No es exactamente referencia pero entendamos esto
Lo que no funciona al menos en la gambas 2 es utilizar punteros a clases que sería la correspondencia lógica en C a usar punteros a estructuras. Eso habrá que probarlo en gambas 3 cuando exista varptr