pasemos a las funciones...

Started by Futu-block, July 29, 2011, 09:36:07 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

KeoH

buena pregunta .... algo parecido a vectores no? XDD ni idea

Rein (K´)ah Al-Ghul

Haganle caso a drumpi, lo mas facil es armar un tipo de dato...
Crear el dato (typedef)
Declarar el nuevo tipo de dato
en la funcion retornas el nuevo tipo de dato


sobre los punteros:

http://es.wikipedia.org/wiki/Puntero_(informática)

en resumen es una variable que contiene una direccion de memoria...
osea es algo que apunta a, por ejemplo otra variable...

Rein (K´)ah Al-Ghul
Infected with the Krieger strain of the Human-MetaHuman Vampiric Virus.

en vez de darme Karma positivo, denme (K´)arma negativ

Yawin

Personalmente, discrepo. El uso de los punteros, al principio parece lioso. Pero es más fácil que comerse una piruleta.
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

Drumpi

Rein lo ha dicho perfecto: son variables que señalan a otras variables o a zonas de memoria de tamaño variable.
Su uso principal es el de, por ejemplo, pasarle a una función el sitio donde debe leer/guardar valores, por ejemplo, una variable. Si hacemos:


  int mi_variable = 5;
  mi_función(mi_variable);
  (...)

function mi_función (int valor)
begin
  valor++;
  say(valor);
end


Valor valdrá uno más de lo que valía cuando se llamó a la función, seis (y se verá en el say), sin embargo, mi_variable sigue valiendo 5. Es lo que se llama "paso por valor", la función usa una copia para trabajar.
Sin embargo:


  int mi_variable = 5;
  mi_función(offset mi_variable);
  (...)

function mi_función (int pointer valor)
begin
  *valor++;
  say(*valor);
end


Valor valdrá uno más de lo que valía cuando se llamó a la función, seis (y se verá en el say), sin embargo, mi_variable ahora también valdrá 6 ¿Por qué? porque ya no trabajamos con una copia, se está usando la posición de memoria donde se guarda el valor de mi_variable (de ahí que se le pase a la función el OFFSET de la variable, no su contenido. La función recibe un puntero a un entero a la que llamamos valor. Ahora valor no contiene 5, sino una dirección de memoria, por lo que no podemos hacerle valor++, porque entonces estamos diciendo que apunte a la siguiente posición de memoria, por eso se pone un asterisco antes, para decirle "modifica el valor al que puntas".
Es lo que se llama "paso por referencia", porque se le indica una referencia a dónde debe mirar para obtener el valor.

El otro uso es el de almacenar datos en memoria, con una cantidad modificable, de manera que siempre usemos la menos posible. Eso ya lo expliqué hace tiempo en el hilo de arrays con memoria dinámica para novatos, como un ejemplo. Luego ya están las listas enlazadas, los árboles, las estructuras complejas y demás, pero eso mejor dejarlo para los libros de C.
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)

KeoH

Pues este post ayuda tela xD porq hacia tiempo q queria saber a manejar punteros xD pero no tenia idea xD esto ayuda xD. Se puede hacer q el puntero sea una tabla? algo asi como esto:


int mi_tabla[2];
asigna_valores(offset mi_tabla);
.
.
.
function asigna_valores(int pointer tabla)

begin
    *tabla[0]=1;
    *tabla[1]=2;
    *tabla[2]=3;
end



Este codigo seria válido? o es una parida? xDDD

HaCkZJuaNN

#20
Que yo sepa, los arrays son punteros de por sí (al menos creo recordar que en Bennu funcionaban igual que lo hacen en C, aún estoy en proceso de reconciliación) . Cuando defines una tabla como

int mi_tabla[2];

mi_tabla es un puntero constante que señala al inicio de la tabla. Cuando haces mi_tabla[0] estás diciendo que acceda a la primera posición, y mi_tabla[1] a la segunda.

Por tanto, tu código está casi bien, pero te sobran los asteriscos(dereferencias) y el offset. Sería:

(No sé cómo insertar un bloque de código)

int mi_tabla[2];
asigna_valores(mi_tabla);
...
function asigna_valores(int pointer tabla)

begin

tabla[0] = 1;
tabla[1] = 2;
tabla[2] = 3;

end

Por si quieres ir un poco más allá, y siempre y cuando no me equivoque y los punteros se manejan igual que en C; la expresión mi_tabla[j] es absolutamente equivalente a escribir *(mi_tabla+j); donde la suma significa "coger la posición de memoria a que apunta mi_tabla y desplazarme i lugares de tamaño el tipo de mi_tabla hacia delante". Esto en Bennu es poco útil saberlo y utilizarlo, de todas formas; al menos que yo sepa.

Ruego si me equivoco y algo de lo que he dicho es mentira me lo indiquéis para que pueda borrarlo y evitar confusiones.[/i]

SplinterGU

#21
es correcto juan como has dicho...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

Quote from: SplinterGU on October 20, 2011, 06:42:56 PM
es correcto juan como has dicho... por lo menos la primera parte... lo de mi_tabla[ i][j] que es equivalente a *(mi_tabla+j) no es correcto...

mi_tabla[ i][j] es equivalente a mi_tabla[i*cantidad de columnas+j]...

pero entiendo que has querido explicar que *var[] es un array de punteros, lo cual es correcto.

Nono, lo que pasa es que la [ i ] me lo ha sustituido por uan cursiva, que no he sabido quitar, y luego le he añadido la j.

Lo que quería decir es que mi_tabla[ j ] = *(mi_tabla+j)

SplinterGU

ah, eso es correcto.

edita el mensaje, quita la italica... y yo tacho mi mensaje...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

El día en que se sepan manejar los punteros, las llamadas a funciones con punteros a punteros, y todo tipo de listas y árboles enlazados con punteros, es cuando sabrás que sabes programar.



...Al menos, lo más básico para cualquier lenguaje ;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)

KeoH

pues esto es muy util, por ejemplo cuando tienes una funcion q calcula varias cosas y para tener organizados los datos usas la tabla xD gracias! xD

HaCkZJuaNN

Quote from: SplinterGU on October 20, 2011, 07:35:50 PM
ah, eso es correcto.

edita el mensaje, quita la italica... y yo tacho mi mensaje...

Done.