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!
¿Puede ser por el tipo de valor que devuelve la función?
¿Seguro que es una función y no un proceso?
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.
¿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
le funciona si usa una variable, entonces no es la declaracion.
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.
espero la porcion exacta de codigo...
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
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( ....
¿No debería ser int por defecto? :|
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
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.
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ó!!
;)
Bueno, splinter, yo me refería al valor devuelto por cualquier función hecha en C, no en Bennu ^^U En bennu el error siempre es 0.
De todas formas, tomo nota mental para la próxima: valores devueltos son siempre DWORD (o INT sin signo ^^U).
las funciones en C ahora si devuelven valores INT, cuando se hizo la documentacion en la WIKI de fenix en fenixworld, yo lo cambie todo a INT.
aca estabamos hablando de las funciones escritas por el usuario desde bennu, no en C.
asi que hubo un malentendido, pense que seguias el hilo de la conversacion.
Y la sigo, quizás no me expliqué bien, porque esta vez la última frase me refería a Bennu ^^U