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
no estoy seguro pero no creo q no esta soportado la sobrecarga de funciones...
no lo esta, debido a que el lenguaje hace conversion automatica de parametros.
Y eso esta entre los planes futuros o quedara asi???
bufffff, funciones, cosa que me gustaria aprender...
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.
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);
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.
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.
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.
de nada...
cuando puedas...
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]
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
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?
gracias rein, carma = carma -1; para ti...
jeje je
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...
:( :-\ :-\ :-\ :-\ :'(
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...
http://wiki.bennugd.org/index.php?title=Function
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
del tiron iba a darle karma a DCelso, hasta que ví una pagina muy vista para mí...
gracias de todas formas, seguiré probando...
y el return como se comprueba o se mira o que se hace???
odere como no comprenda esto... ;(
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...
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
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;