Bennu Game Development

Foros en Español => Mesa de Ayuda => Topic started by: josebita on December 09, 2008, 10:53:44 PM

Title: [BUG] ¿Qué estoy haciendo mal con la función abs()?
Post by: josebita on December 09, 2008, 10:53:44 PM
Hola:
El siguiente código no me da el resultado que esperaba...
[code language="bennu"]Import "mod_math";
Import "mod_say";

Process main()
Begin
  say(abs(2));
End;[/code]Entiendo que abs() devuelve el valor absoluto de un número, ¿verdad?.
Bueno, pues la salida es:
joseba@josebita-laptop:karaoke$ bgdi tonto2
-0.000031

¿Qué me estoy perdiendo?  ???
Title: Re: ¿Qué estoy haciendo mal con la función abs()?
Post by: SplinterGU on December 09, 2008, 11:12:11 PM
parece ser un error... raro...
Title: Re: ¿Qué estoy haciendo mal con la función abs()?
Post by: josebita on December 09, 2008, 11:12:55 PM
Intenta probarlo tú, a ver si es realmente un bug o es que estoy tonto...
Muchas gracias por adelantado.
Title: Re: ¿Qué estoy haciendo mal con la función abs()?
Post by: Prg on December 09, 2008, 11:50:01 PM
copié tu código completamente y me da esto

[code language="bennu"]> Executing: C:\Archivos de programa\ConTEXT\ConExec.exe "C:\devBennu\bin\bgdi.exe" ero

2
> Execution finished.[/code]

2, lo cual es completamente correcto, a menos que sea porque tengo la versión 15c de windows y tú uses otra.
Title: Re: ¿Qué estoy haciendo mal con la función abs()?
Post by: josebita on December 09, 2008, 11:55:39 PM
Gracias, prg. Yo estoy en la última de linux (wip16, creo).
A ver si tengo un rato para probar en otro linux, pa ver si es que mi ordenador está loco. ¿Alguien más lo ha probado en linux?.
Title: Re: ¿Qué estoy haciendo mal con la función abs()?
Post by: SplinterGU on December 09, 2008, 11:58:42 PM
ahora mismo no puedo probarlo...

A mi me da un numero gigante, pero esta mal de todas formas, quizas sea algo de linux...

Ahora mismo no puedo dedicarle tiempo...

Anotado...

Title: Re: ¿Qué estoy haciendo mal con la función abs()?
Post by: josebita on December 10, 2008, 12:05:02 AM
Vaya, seguro que es una tontería. Cuando puedas, entonces.
Title: Re: [BUG] ¿Qué estoy haciendo mal con la función abs()?
Post by: SplinterGU on December 10, 2008, 08:26:24 PM
ya vi este error, no es tan tonteria...

se trata de usar...

static int math_abs( INSTANCE * my, int * params )
{
    float num = *( float * ) &params[0] ; <<<
    float res = ( num < 0 ) ? -num : num ;
    return *(( int * )&res ) ; <<<
}

creo que animanegra o alguien una vez hablo de esto en el foro de fenix... la cosa es que antes funcionaba bien, supongo que porque antes yo usaba una version de gcc anterior... se que las ultimas versiones de gcc no son la gloria... voy a comparar con alguna version linux de bennu anterior... me intriga saber que ocaciona esto...

igual esto implica cambiar toda funcion que use esta forma, que es muuuuuchoooooooo....


Title: Re: [BUG] ¿Qué estoy haciendo mal con la función abs()?
Post by: SplinterGU on December 10, 2008, 08:33:08 PM
el problema esta en la linea de return, asi que entonces es menos grave, pero no deja de ser grave el asunto... fucking gnu... (este tipo de cosas son las que hacen a uno dudar del soft libre, pero bueno...)

se soluciona con esto

static int math_abs( INSTANCE * my, int * params )
{
    float num = *( float * ) &params[0] ;
    float res = ( num < 0 ) ? -num : num ;
//    return *(( int * )&res ) ;
    int ret;
    memmove (&ret, &res, sizeof(ret));
    return (ret);
}

o usando un union... puf, que molesto... evidentemente es un bug del gcc, puesto que ambas cosas hacen lo mismo, salvo que el casteo no funciona... ya avisa con un warning y supongo que por eso no compila ese codigo... vamos a ver si hay algun flag o algo que solucione este problema y no tenga que tocar cada maldito fuente...
Title: Re: [BUG] ¿Qué estoy haciendo mal con la función abs()?
Post by: SplinterGU on December 10, 2008, 08:44:59 PM
parece que el problema se soluciona agregando -fno-strict-aliasing a los flags de compilacion, vamos a verificar...


EDIT:
Solucionado con ese flag de compilacion... fucking gcc 4.x...

EDIT2:

`-fstrict-aliasing'
     Allows the compiler to assume the strictest aliasing rules
     applicable to the language being compiled.  For C (and C++), this
     activates optimizations based on the type of expressions.  In
     particular, an object of one type is assumed never to reside at
     the same address as an object of a different type, unless the
     types are almost the same.  For example, an `unsigned int' can
     alias an `int', but not a `void*' or a `double'.  A character type
     may alias any other type.

     Pay special attention to code like this:
          union a_union {
            int i;
            double d;
          };

          int f() {
            a_union t;
            t.d = 3.0;
            return t.i;
          }
     The practice of reading from a different union member than the one
     most recently written to (called "type-punning") is common.  Even
     with `-fstrict-aliasing', type-punning is allowed, provided the
     memory is accessed through the union type.  So, the code above
     will work as expected.  However, this code might not:
          int f() {
            a_union t;
            int* ip;
            t.d = 3.0;
            ip = &t.i;
            return *ip;
          }

     ...

     Enabled at levels `-O2', `-O3', `-Os'.


EDIT3:
Fucking gcc 3.x && 4.x... :D
yo creo que usaba 2.95 antes... eso es lo que debia pasar que funcionaba...
Title: Re: [BUG] ¿Qué estoy haciendo mal con la función abs()?
Post by: josebita on December 11, 2008, 10:42:15 PM
:) Ya dijeron cuando sacaron el gcc 4 que se había vuelto algo pedante con el código....
Gracias por mirarlo.

PS: Sorry por no contestar antes, se me fue la cabeza
Title: Re: [BUG] ¿Qué estoy haciendo mal con la función abs()?
Post by: SplinterGU on December 11, 2008, 10:50:31 PM
no, perfecto, gracias a vos por el aviso, a mi se me paso... no me di cuenta...