Quiero aclararme del todito con las funciones....

Started by Danielo515, April 21, 2010, 03:30:03 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Danielo515

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

Rein (K´)ah Al-Ghul

no estoy seguro pero no creo q no esta soportado la sobrecarga de funciones...

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

SplinterGU

no lo esta, debido a que el lenguaje hace conversion automatica de parametros.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Rein (K´)ah Al-Ghul

Y eso esta entre los planes futuros o quedara asi???

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

Futu-block

bufffff, funciones, cosa que me gustaria aprender...

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

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);
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)

Danielo515

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.

SplinterGU

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.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515

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.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Danielo515


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]

Rein (K´)ah Al-Ghul

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

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

SplinterGU

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?
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Futu-block

gracias rein, carma = carma -1;  para ti...

jeje je