Error raro al llamar a una funcion en un IF

Started by warrior_rockk, June 13, 2010, 06:59:38 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

warrior_rockk

Me ocurre un fallo extraño que supongo que es culpa mía, ya que es algo tan básico de Bennu que sabemos que funciona. Resulta que tengo un código donde hago un if con el valor de retorno de una función y, sólo me funciona cuando igualo el valor de retorno a una variable antes de llamar al if. Ejemplo:

NO ME FUNCIONA:

[code language="bennu"]if (funcion()==1)
....
end:[/code]

SI ME FUNCIONA:
[code language="bennu"]variable = funcion();
if (variable == 1)
....
end;[/code]

Sé de sobra que funciona ya que, probando un ejemplo así simple, funciona correctamente. Mi pregunta es, ¿que factores pueden provocar que no llegue a funcionar? El problema es que, no puedo trazarlo con el depurador porque al retornar de la llamada función, el trace salta a otro proceso en vez de volver al que lo llamó. Recuerdo que en la época de Fenix, comentaron que esto era así, que en el depurador las pilas de llamadas no se trazan bien. ¿Sigue siendo así en Bennu? ¿No puede volver el trazador al proceso que lo llamó y así seguir la secuencia de ejecución real? 

Saludos y gracias!



Fede

¿Puede ser por el tipo de valor que devuelve la función?
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.

panreyes

¿Seguro que es una función y no un proceso?

SplinterGU

por que no pones el codigo exacto que de da el problema? seguro que tenes mas que un "if ( funcion() == valor )" y te deben faltar parentesis en algun lado.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

¿Usas la función en el IF antes o después de haberla declarado? Esos fallitos iniciales siempre tienen fácil solución, tú pon todo el código, no te cortes :P
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

SplinterGU

le funciona si usa una variable, entonces no es la declaracion.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Lo mismo digo una tontería pero ¿puede tener algo que ver el ; después de los END? Lo digo porque por lo general Bennu toma los ; como fin de linea y NO SUELE dar problemas, pero en el primer ejemplo ha puesto :
Seguramente sea un error tipográfico que no tenga nada que ver.
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)

SplinterGU

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

warrior_rockk

Gracias por contestar. Este sería la porción exacta de código:

[code language="bennu"]if ( colision_x(fich_nivel,dur_nivel,p_personaje.alto,p_personaje.x,p_personaje.y,(p_personaje.x+v_x),dur_suelo) < 0 )
p_personaje.x+=v_x;
end;[/code]

[code language="bennu"]function colision_x(Int fich,Int graf,Int alto,Int x_org,Int y_org,Int x_dest,Int color)
Begin
...(codigo extenso que no viene al caso y que liaría el propósito del post)
Return -1;
end[/code]

En la función siempre se ejecuta el return -1 , pero sólo se me cumple el if anterior si igualo el resultado de colision_x a una variable. Como información adicional, pero entiendo que no tiene nada que ver, la función esta en otro archivo que añado con un "include". Esto supongo que no afecta a nada ya que, el precompilador añade el código y listo

SplinterGU

ya veo el problema, por defecto las funciones (supongo que los procesos tambien) se definen con tipo DWORD, y por eso no funciona el < 0, ya que es sin signo. Proba poniendole el tipo al proceso.

function int colision_x( ....
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

panreyes


Drumpi

Idem, de siempre los ID de procesos y funciones han sido INT (aunque claro, es tontería cuando dichos ID nunca son negativos).
Pero vamos, que guiándonos por estandars: toda función que devuelve "error" lo hace con un número negativo, por lo general, sólo un único error representado por -1 (para que el programador se devane los sesos pensando cual de los 20 posibles errores es el que ha sucedido). ;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)

SplinterGU

es un entero sin signo.

realmente siempre los documentos dijeron que deberian ser INT, pero nunca lo fueron, ninguna funcion es INT, ni siquieras las internas del lenguaje, siempre fueron DWORD, aunque yo cambie esto en una de las ultimas versiones de fenix, para que correspondan con la documentacion.

Los prototipos por default son DWORD, aunque si lo pasamos a una variable int se transformen en INT.

drumpi, repito, nunca fue asi, siempre fueron sin signo (asi que no es correcto lo que afirmas), yo las hice con signo para que sea mas coherente, se ve que aca falto en los casos donde no hay tipo o por algun otro motivo (que no recuerdo, tendria que revisar el codigo) pasa a ser sin signo, pero lo correcto es que todo se defina con su tipo explicitamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

warrior_rockk

Funciona SplinterGU. Definiendo el tipo de variable de la función, ya me funciona correctamente.  Eso demuestra que siempre hay que cumplir con las definiciones de los lenguajes de programación jjeej. Muchas gracias a todos por la ayuda.

P.D: Es increíble el nivel de colaboración que hay en este foro. Pongo una pregunta y al momento tengo un montón de respuestas. Chapó!!

SplinterGU

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