Autor Tema: 0 > 0 ???  (Leído 1320 veces)

HaCkZJuaNN

  • Full Member
  • ***
  • Mensajes: 179
  • Karma: 5
0 > 0 ???
« en: Febrero 03, 2009, 10:15:43 pm »
Bien, no os voy a poner todo el contexto porque no sé exactamente dónde surge el error, pero sé que tiene que ser un bug o que estoy entendiendo mal el funcionamiento de los floats. El caso es que yo tengo una variable float, que forma parte de un struct pasado por puntero, pero en cualquier caso, la cuestión es que la línea siguiente:

say((*numero).coeficiente+"/"+((*numero).coeficiente > 0));

da como resultado:

0/1

es decir, me dice que el número es 0 pero que es mayor que 0 al mismo tiempo.

por cierto, por aquello de los floats y los ints, he probado también lo siguiente:


say((*numero).coeficiente+"/"+((*numero).coeficiente > 0.0));

asignándole a (*numero).coeficiente el valor 0.0 también, y el resultado es el mismo, así que ése no es el problema.

SplinterGU, si necesitas ver el código entero para localizarlo dímelo y te lo mando.

Un saludo.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12774
  • Karma: 375
Re: 0 > 0 ???
« Respuesta #1 en: Febrero 03, 2009, 10:22:41 pm »
Código: [Seleccionar]
splinter@splinter:~/Bennu/bugs$
splinter@splinter:~/Bennu/bugs$ cat zero.prg

import "mod_say";
begin
say (0.0>0);
end
splinter@splinter:~/Bennu/bugs$ bgdc zero.prg
BGDC 0.93 (Jan 12 2009 20:18:59)
Copyright � 2006-2009 SplinterGU (Fenix/BennuGD)
Copyright � 2002-2006 Fenix Team (Fenix)
Copyright � 1999-2002 Jos�Luis Cebri� Pag� (Fenix)
Bennu Game Development comes with ABSOLUTELY NO WARRANTY;
see COPYING for details


File zero.dcb compiled (12361 bytes):

  Processes                     1
  Global data                 140 bytes
  Local data                   44 bytes
  Private data                  0 bytes
  Public data                   0 bytes
  Code                         20 bytes
  System processes              4
  Globals vars                  3
  Locals vars                   7
  Private vars                  0
  Publics vars                  0
  Identifiers                 171
  Structs                       1
  Strings                       6 (39 bytes)

splinter@splinter:~/Bennu/bugs$ bgdi zero
0
splinter@splinter:~/Bennu/bugs$
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

  • Full Member
  • ***
  • Mensajes: 179
  • Karma: 5
Re: 0 > 0 ???
« Respuesta #2 en: Febrero 03, 2009, 10:41:10 pm »
Sí, claro, eso ya lo había probado yo :P En ese caso funciona como debería, pero en el mío no, y lo que digo no me lo invento, ahí tienes la línea que ejecuto y el resultado.

He estado haciendo más pruebas y he visto como un 1 se transformaba en un 0 al pasarlo como parámetro a una función y un 2 en un -39(vaya número más raro). Creo que es un problema de punteros, con aquello de que los tipos definidos siempre se pasan como punteros en los argumentos de las funciones, aunque se puedan utilizar como si no y al hacer un puntero a un tipo definido por el usuario desde una función a la que le han pasado esa variable SIN puntero, algo raro ocurre. Algo así:

[code language="bennu"]
type lalala
    int v1;
    int v2;
end

global
    lalala mi_var;
end

begin

    mi_var.v1 = 2;
    mi_var.v2 = 3;

    proceso1(mi_var);
end

function proceso1(lalala var)
begin
    proceso2(&var);
end

function proceso2(lalala pointer var2)
begin
    say((*var2).v1+","+(*var2).v2);
end
[/code]

Ese código no lo he probado pero es algo así lo que está ocurriendo, los valores de v1 y v2 se lían con los punteros.

EDIT: Es eso, he probado a quitar los & y pasar las variables como punteros directamente y funciona como debe. No sé si es así como debe comportarse bennu, o si corro riesgos de que en algún caso no funcione, pero funcionar funciona.
« última modificación: Febrero 03, 2009, 10:48:02 pm por HaCkZJuaNN »

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12774
  • Karma: 375
Re: 0 > 0 ???
« Respuesta #3 en: Febrero 04, 2009, 03:44:07 am »
El comportamiento es perfecto...
en proceso1(mi_var), no estas pasando la struct mi_var, sino un puntero a esta... pero gracias a la conversion, le estas diciendo al proceso que es un lalala, sin embargo, cuando haces un & de var, estas pasando el ** de mi_var.

lo correcto seria...

function proceso1(lalala * var)

y luego

proceso2(var);
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

HaCkZJuaNN

  • Full Member
  • ***
  • Mensajes: 179
  • Karma: 5
Re: 0 > 0 ???
« Respuesta #4 en: Febrero 04, 2009, 03:07:00 pm »
Ok, comprendido, sabía que los structs siempre se pasan como punteros, pero creía que eso sólo era "la realidad", y que podías programar como si no fuera así. Lo tendré en cuenta en el futuro :)

En cualquier caso, es curioso que ese tipo de error de como resultado que una variable cuyo valor sea 0 diga que es mayor que 0 :D

Por cierto, gracias.

SplinterGU

  • Hero Member
  • *****
  • Mensajes: 12774
  • Karma: 375
Re: 0 > 0 ???
« Respuesta #5 en: Febrero 04, 2009, 03:13:34 pm »
es que no es 0 la variable, es otra cosa... ya que el puntero donde la queres obtener no es el puntero a la variable donde si dice 0...

EDIT: Es por este tipo de errores que no me gusta la autodeclaracion de procesos y la autoconversion... esas "features" me parecen una aberracion...
« última modificación: Febrero 04, 2009, 03:15:56 pm por SplinterGU »
Download Lastest BennuGD Release: http://www.bennugd.org/node/2