Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: Danielo515 on April 21, 2010, 03:30:03 PM

Title: Quiero aclararme del todito con las funciones....
Post by: Danielo515 on April 21, 2010, 03:30:03 PM
Hola, tengo 2 funciones casi y guales, y tres comportamientos totalmente distintos.

Las funciones son del tipo

camino(fila,col,my_tipo dato, int color)
camino(fila,col,my_tipo dato)

Entonces, a la primera, la puedo llamar así si quiero

camino(1,2, dato, 3)
o así
camino(1,2, null , 3)

Pero a la segúnda, en dos sitios distintos, me obliga a llamarla en cada sitio de una forma.
camino(fila,col,my_tipo dato)
En un sitio, la puedo llamar así
camino(1,2, dato)
Pero en otro me obliga a hacerlo así
camino(1,2, &dato, 3)

ya que ni esto camino(1,2, dato) ni esto camino(1,2, null) le valen ¿A que se debe?

De momento, me funciona, pero temo que sea fuente de errores caóticos futuros
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Rein (K´)ah Al-Ghul on April 21, 2010, 04:05:22 PM
no estoy seguro pero no creo q no esta soportado la sobrecarga de funciones...
Title: Re: Quiero aclararme del todito con las funciones....
Post by: SplinterGU on April 21, 2010, 04:34:22 PM
no lo esta, debido a que el lenguaje hace conversion automatica de parametros.
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Rein (K´)ah Al-Ghul on April 21, 2010, 05:15:06 PM
Y eso esta entre los planes futuros o quedara asi???
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Futu-block on April 21, 2010, 06:48:17 PM
bufffff, funciones, cosa que me gustaria aprender...
Title: Re: Quiero aclararme del todito con las funciones....
Post by: SplinterGU on April 21, 2010, 07:40:26 PM
la autoconversion de tipos de datos es un tema delicado, bennu inicialmente deshabilitaba esa funcionalidad, pero fueron demasiados los problemas de adaptacion de los usuarios que ahora esta como opcion de parametros de arranque del compilador... quizas se pueda usar que en ese modo se puedan hacer sobrecargas de funciones... aunque requeririan modificaciones en el dcb...

a futuro podria ser.
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Drumpi on April 22, 2010, 12:31:16 AM
Futublog: una función es lo mismo que un proceso, sólo que congela al padre de forma automática al ser llamado y lo descongela al terminar, y además, puede devolver un valor usando return, dicho valor lo puedes leer igual que lees la ID de un proceso al crearse:

valor=mi_funcion(parametros);
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Danielo515 on April 22, 2010, 10:08:13 AM
Je je je, me he vuelto a confundir.

Lo que quiero decir, es que en este caso son 2 funciones DISTINTAS pero muy parecidas, el que pusiera el mismo nombre, fué un error.

Ahora que ya está explicado. ¿Me puede aclarar alguien este comportamiento?

Ah, y por cierto ¿bennu admite funciones recursivas? es que al intentar utilizar una, se me cierra, bueno, me lo cierra windows.
Title: Re: Quiero aclararme del todito con las funciones....
Post by: SplinterGU on April 22, 2010, 02:43:21 PM
si la recursividad es exagerada, obviamente no va a funcionar... se le va el stack... pero en principio funciona... hay varios ejemplos al respecto, busca el de fill por ejemplo...

con respecto a tu consulta... busca en el foro declare... esta explicado muchas veces... asi no repetimos nuevamente explicacion... si no es eso, volve a consultar con un ejemplo...

por otro lado, cuando decis "dato" y "&dato" te referis siempre a la misma variable? o son diferentes? no sera que 1 es puntero y la otra no?

gracias.
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Danielo515 on April 22, 2010, 07:25:05 PM
No, gracias a tí splinter.

Y no, no es ningún problema con el declare, ya que tengo varios procesos declarados, y ningún problema con ninguno.
Y dato y &dato, no son la misma variable porque es en dos procesos distintos con variables private, pero ninguna es un puntero.
Puedo poner un poco de código, pero tengo todo tan liado y horrible, a ver si lo organizo un poco y lo muestro.
Title: Re: Quiero aclararme del todito con las funciones....
Post by: SplinterGU on April 22, 2010, 07:33:50 PM
de nada...

cuando puedas...
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Danielo515 on April 23, 2010, 07:52:00 AM

Aquí están las funciones. Si hace falta algo más, o de aquí no se deduce nada, dímelo y buscaré donde me da los distintos fallos.
[code language="bennu"]


function int camino(fila,col,tipo_dir dirs)
private
dir1=0;
dir2=0;
dir3=0;
dir4=0;
direccion=0;
color=0;
camin=0;//esto se u
begin
say("Analizando el camino más ventajoso*****");
if(   espacios[fila][col+1]<=3 and espacios[fila][col+1]!=0 )
         color=espacios[fila][col+1];
         dir1+=analiza_camino(fila,col,color,_IZQUIERDA);
         say("la derecha tiene: "+dir1);
         /*----*/
end
if(espacios[fila][col-1]<=3 and espacios[fila][col-1]!=0)
         color=espacios[fila][col-1];
         dir2+=analiza_camino(fila,col,color,_DERECHA);
         say("la izquierda tiene: "+dir2);
         /*----*/
end
if(espacios[fila+1][col]<=3 and espacios[fila+1][col]!=0)
         color=espacios[fila+1][col];
         dir3+=analiza_camino(fila,col,color,_ARRIBA);
         say("abajo tiene: "+dir3);
         /*----*/
end
if(espacios[fila-1][col]<=3 and espacios[fila-1][col]!=0)
         color=espacios[fila-1][col];
         dir4+=analiza_camino(fila,col,color,_ABAJO);
         say("arriba tiene: "+dir4);
               
         /*----*/
end


if(dir1>dir2 and dir1>dir3 and dir1>dir4 and dir1>1)
   direccion=1;
   Say("El camino a tomar es derecha");
elseif(dir2>dir3 and dir2>dir4 and dir2>1)
   direccion=2;
   Say("El camino a tomar es izquierda");
elseif(dir3>dir4 and dir3>1)
   Say("El camino a tomar es abajo");
   direccion=3;
elseif(dir4>1 )
   Say("El camino a tomar es arriba");
   direccion=4;
else
   say("el camino a tomar es ¡ninguno!");
end

         switch(direccion)
               case 1://derecha
                     dirs.ver=0;
                     dirs.hor=1;
                     say("Dando instrucciones para ir a la derecha "+dirs.ver+"-"+dirs.hor);
               end
               case 2://izquierda
                     dirs.ver=0;
                     dirs.hor=-1;
                     say("Dando instrucciones para ir a la izquierda "+dirs.ver+"-"+dirs.hor);
               end
               case 3: //abajo
                     dirs.ver=1;
                     dirs.hor=0;
                     say("Dando instrucciones para ir abajo "+dirs.ver+"-"+dirs.hor);
               end
               case 4://arriba
                     dirs.ver=-1;
                     dirs.hor=0;
                     say("Dando instrucciones para ir arriba "+dirs.ver+"-"+dirs.hor);
               end
         end
         
   return direccion; //porque esta función también se usa para saber si el zombie debe salir, o no
end



function camino_color(fila,col,tipo_dir dirs,int color)
private
dir1=0;
dir2=0;
dir3=0;
dir4=0;
direccion=0;

begin
say("Buscando siguiente del color dado*****");
if(   espacios[fila][col+1]<=3 and espacios[fila][col+1]==color )
         for(i=1;i<_columnas and espacios[fila][col+i]==color;i++)
            dir1++;
         end
         if(dirs!=null)say("la derecha tiene: "+dir1);end//porque también sirve como soporte a la función camino, esta info no es necesaria
         /*----*/
end
if(espacios[fila][col-1]<=3 and espacios[fila][col-1]==color)
         for(i=1;i>0 and espacios[fila][col-i]==color;i--)
            dir2++;
         end
         if(dirs!=null)say("la izquierda tiene: "+dir2);end//porque también sirve como soporte a la función camino, esta info no es necesaria
         /*----*/
end
if(espacios[fila+1][col]<=3 and espacios[fila+1][col]==color)
         for(i=1;i<_filas and espacios[fila+i][col]==color;i++)
            dir3++;
         end
         if(dirs!=null)say("abajo tiene: "+dir3);end//porque también sirve como soporte a la función camino, esta info no es necesaria
         /*----*/
end
if(espacios[fila-1][col]<=3 and espacios[fila-1][col]==color)
         for(i=1;i>0 and espacios[fila-i][col]==color;i--)
            dir4++;
         if(dirs!=null)say("arriba tiene: "+dir4);end//porque también sirve como soporte a la función camino, esta info no es necesaria
         end
         /*----*/
end


if(dir1>dir2 and dir1>dir3 and dir1>dir4)
   direccion=1;
   if(dirs!=null)Say("El camino a seguir es derecha");end//porque también sirve como soporte a la función camino, esta info no es necesaria
elseif(dir2>dir3 and dir2>dir4)
   direccion=2;
   if(dirs!=null)Say("El camino a seguir es izquierda");end//porque también sirve como soporte a la función camino, esta info no es necesaria
elseif(dir3>dir4)
   if(dirs!=null)Say("El camino a seguir es abajo");end//porque también sirve como soporte a la función camino, esta info no es necesaria
   direccion=3;
elseif(dir4>0)
   if(dirs!=null)Say("El camino a seguir es arriba"); end//porque también sirve como soporte a la función camino, esta info no es necesaria
   direccion=4;
else
   if(dirs!=null)say("El camino a seguir es ninguno");end
end

   if(dirs!=null) //porque también sirve como soporte a la función camino, esta info no es necesaria
         switch(direccion)
               case 1://derecha
                     dirs.ver=0;
                     dirs.hor=1;
                     say("Dando instrucciones para ir a la derecha "+dirs.ver+"-"+dirs.hor);
               end
               case 2://izquierda
                     dirs.ver=0;
                     dirs.hor=-1;
                     say("Dando instrucciones para ir a la izquierda "+dirs.ver+"-"+dirs.hor);
               end
               case 3: //abajo
                     dirs.ver=1;
                     dirs.hor=0;
                     say("Dando instrucciones para ir abajo "+dirs.ver+"-"+dirs.hor);
               end
               case 4://arriba
                     dirs.ver=-1;
                     dirs.hor=0;
                     say("Dando instrucciones para ir arriba "+dirs.ver+"-"+dirs.hor);
               end
         end
   end      
return direccion;
end
[/code]
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Rein (K´)ah Al-Ghul on April 23, 2010, 04:18:13 PM
Quote from: Futublog on April 21, 2010, 06:48:17 PM
bufffff, funciones, cosa que me gustaria aprender...

ya sabes usar funciones :P
no usas set_mode(),etc ???

es como dijo drumpi...
basicamente se "agrega" la porcion de codigo en la seccion donde se llama la funcion...


//principal
BEGIN
   write( 0, 0, 0, 0, suma( 4 + 5 ) );
   write( 0, 0, 10, 0, suma( 6 + 7 ) );
END

FUNCTION suma( operandoUno, operandoDos )
BEGIN
return( operando1 + operando2 );
END
Title: Re: Quiero aclararme del todito con las funciones....
Post by: SplinterGU on April 23, 2010, 04:54:52 PM
en el codigo que pusiste no veo ningun &... por favor, podes pasar el codigo que decis, que sea compilable, probable y remarcando donde decis que falla?
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Futu-block on April 23, 2010, 07:12:54 PM
gracias rein, carma = carma -1;  para ti...

jeje je
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Futu-block on April 29, 2010, 10:31:30 PM
vamos a ver, con el tema de las funciones que no me aclaro; ¿¿se pone en cualquier lado del proceso o despues??
el tema de los parametros, son variables (creo) ¿no?
otra cosa, el return (que es el valor que devuelve) es el que voy a usar para cualquier cosa ¿no? independientemente de si es una operacion, o pasa por un if

buf, a ver si experimento en un juego mas corto...

:(  :-\ :-\ :-\ :-\ :'(
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Rein (K´)ah Al-Ghul on April 29, 2010, 10:44:34 PM
Return en el caso de que devuelva un valor...

la declaracion va despues de los procesos....
pero la puede llamar en cualquier lugar del programa principal, proceso u otras funciones ( o dentro de  la misma funcion)...

Los parametros son valores que pasas...
osea lo podes cambiar ahi y eso no afecta a la variable q pasaste desde donde llamaste la funcion
tmb podes pasar punteros, si necesitas que el cambio afecte al valor que pasaste como parametro...
Title: Re: Quiero aclararme del todito con las funciones....
Post by: DCelso on April 29, 2010, 11:39:43 PM
http://wiki.bennugd.org/index.php?title=Function
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Drumpi on April 30, 2010, 01:29:03 AM
A ver si con esto te queda más claro:

process mi_proceso (param1, param2)
private
(...)
begin
(codigo)
end

function mi_funcion (param3, param4, param5...)
private
int variable1;
(...)
begin
(código)
return(variable1); //opcional
end
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Futu-block on April 30, 2010, 09:38:35 PM
del tiron iba a darle karma a DCelso, hasta que ví una pagina muy vista para mí...
gracias de todas formas, seguiré probando...
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Futu-block on May 01, 2010, 09:28:18 AM
y el return como se comprueba o se mira o que se hace???

odere como no comprenda esto... ;(
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Windgate on May 01, 2010, 01:06:51 PM
Si tienes una función que retorna un valor lo normal es que la invoques y asignes a una variable su resultado, por ejemplo:

FUNCTION int sumar ( int a , int b )
BEGIN
   RETURN a + b;
END


Entonces para comprobar el valor de retorno de esa función suma harías, por ejemplo:

x = sumar ( 8 , 10 );

Y en x se almacenaría el valor de retorno de la función suma, que sería 18...
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Futu-block on May 01, 2010, 07:36:22 PM
Quote from: Windgate on May 01, 2010, 01:06:51 PM
Si tienes una función que retorna un valor lo normal es que la invoques y asignes a una variable su resultado, por ejemplo:

FUNCTION int sumar ( int a , int b )
BEGIN
   RETURN a + b;
END


Entonces para comprobar el valor de retorno de esa función suma harías, por ejemplo:

x = sumar ( 8 , 10 );

Y en x se almacenaría el valor de retorno de la función suma, que sería 18...

Vale, creo que lo voy comprendiendo; lo del return no lo puedes usar en otro proceso ni puede llamarse a traves de una pulsacion o algo parecido; la funcion es una cosa que está esperando que se invoque para ejecutarse pero todo dentro del bloque ''funcion''

a ver si me comprendeis..¿¿ :D
Title: Re: Quiero aclararme del todito con las funciones....
Post by: Rein (K´)ah Al-Ghul on May 01, 2010, 09:21:47 PM
Quote from: Futublog on May 01, 2010, 07:36:22 PM
la funcion es una cosa que está esperando que se invoque para ejecutarse pero todo dentro del bloque ''funcion''
exactamente eso...
se ejecuta todo lo que esta desde el begin al end de la funcion, como si fuera el programa principal...
son utiles reemplazar codigo muy repetitivo...
y para dejar el codigo en pocas lineas ( meter todo dentro de funciones y usarlo asi )
FUNCTION int sumar ( int a , int b )
BEGIN
   RETURN a + b;
END
...
x = sumar ( 8 , 10 );
// es lo mismo que:
x =  a + b;