[BUG] -727379969

Started by FreeYourMind, March 13, 2011, 10:02:16 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

FreeYourMind

He encontrado un BUG, parece ser que los ints en memoria petan si hacemos una comparacion demasiado grande.

Tengo una variable global:

ScorePlayer1 = 0;

Si al principio de un proceso pongo esto:

IF (ScorePlayer1 > 999999999999)
    ScorePlayer1 = 999999999999;
END

La variable global pasa a tener el siguiente valor:

ScorePlayer1 = -727379969

SplinterGU

#1
se te fue la mano con el numero... google y vas a encontrar el valor maximo de un int (con y sin signo)

demas esta decir que no es un bug del compilador... sino del programador.

todo por el contrario, es correcto que te de ese valor...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

ya, pero un divlike tiene que controlar ese tipo de error

SplinterGU

bennugd es mas orientado a C... ese valor, es el mismo valor que da C... asi que esta perfecto.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Pero lo que no entiendo es porque la condicion modifica el valor si esta no se verifica...

No hay int32 ? Que solución propones ?, porque quiero un score de ese tamaño...

SplinterGU

#5
el score de ese tamaño no lo vas a poder tener.

claro, porque 0 es mayor que -727379969

free, el int es int32... con 32bits no se puede hacer ese numero que pretendes, por eso tenes este problema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

primero te sugiero que no uses int, sino unsigned int, luego de eso, pongas el maximo en el valor maximo de un INT, pero diria que le saques 1 digito, porque sino nunca podras llegar al maximo ya que el numero da la vuelta.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

usa google, pero te adelanto que solo podras usar de forma segura 9 digitos... otra opcion es pasar de los ints y hagas un array de digitos y te armas las funciones de suma (y resta si necesitas)
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

Me referia a int64 (que tonto soy).

SplinterGU

int64 lo mismo que doubles, no existen en bennugd.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

FreeYourMind

ahi voy yo, estaria bien que estuvieran  ;D

SplinterGU

eso ya lo sabemos todos desde hace mucho...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

32Bits es aproximadamente 4.000.000.000, suponiendo enteros sin signos.
Lo de 64 bits ya se habló, que había que modificar muchísimas cosas del código interno (más bien todo, porque todo se basa en INT).

De todas formas, creo que la solución sería usar float ¿no? ¿no se diseñaron para representar tanto números pequeños como grandes? vale que no son tan precisos, que haría falta double, pero es lo que hay... o dividir el valor gigante en partes como dice Splinter, y usar multiplicaciones, divisiones y restos para acceder a una o a otra parte: por ejemplo, 37487 se puede representar como (37*1000) + (487*1) y sólo necesitas dos variables que contengan 37 y 487.
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)

Yawin

Como te ha dicho Spliter, la mejor solución es emplear el unsigned int.

p.d.: He estado un cuarto de hora riéndome, tio. Mira que no saber que las tipos de variable tienen límites... jajajajaja
Sigue el desarrollo de mi motor RPG: https://www.youtube.com/watch?v=TbsDq3RHU7g

process main()
       begin
           loop
               pedo();
               frame;
            end
       end

FreeYourMind

Ya, pero en la practica te recuerdas siempre de los conceptos ?
Cuando declaras variables, intentas minimizar su uso y no crear variables inecesarias que sólo van ocupar memoria ?
Hay muchas cosas que uno sabe y que no implementa correctamente ni hace uso de ellas...