#1488 closed defect (fixed)
Error usando la función Range de TimeSets
Reported by: | Pedro Gea | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | highest | Milestone: | Mantainance |
Component: | Kernel | Version: | 3.1 |
Severity: | blocker | Keywords: | |
Cc: |
Description
El código:
TimeSet ts = Range(D(1)*M(1), -5, 2, C); Date Succ(y1900, ts, 1);
no funciona en TolBase v3.1 y da la siguiente advertencia:
Warning: [9] BTmsIntersection::Predecessor ha sido abortado porque se ha salido del rango de cálculo operando entre las fechas [y1900m01d06,y1900m01d06] Probablemente se trata de una expresión del conjunto temporal vacío.
Change History (10)
comment:1 Changed 13 years ago by
Resolution: | → fixed |
---|---|
Status: | new → closed |
comment:2 Changed 13 years ago by
Resolution: | fixed |
---|---|
Status: | closed → reopened |
Justo con esa versión: "v3.1 p007 2012-03-15 19:31:11 i686-win" es con la que me ocurre.
comment:3 Changed 13 years ago by
Yo acabo de volver a bajar el TOLBase 3.1 actual por si acaso y me funciona correctamente.
Escribo este código TOL
WriteLn("Version = "<<Version); TimeSet ts = Range(D(1)*M(1), -5, 2, C); Date dte = Succ(y1900, ts, 1); WriteLn("dte = "<<dte);
y obtengo esto
Version = v3.1 p007 2012-03-15 19:31:11 i686-win dte = y1900m01d02
No me sale ningún warning y devuelve la fecha correcta.
comment:4 Changed 13 years ago by
Quizá así:
Date DefFirst := y2011; Date DefLast := y2012; TimeSet ts = Range(D(1)*M(1), -5, 2, C); Date Succ(y1900, ts, 1);
se vuelve reproducible.
Aunque no esé que valor tienen las fechas por defecto en el comportamiento de funciones como Range
y Succ
.
comment:6 Changed 13 years ago by
Acabo de probarlo con la versión
Text Version "v3.1 p008 2012-03-19 13:12:11 +0100 CET i686-linux-gnu"
y el error se manifiesta:
18:08:26 TOL> Date Succ(y1900, ts, 1); <W> Warning: [3] BTmsIntersection::Predecessor has been aborted because it has fall out of calculation range operating between dates y1900m01d06,y1900m01d06] Probably this is an expression of empty time set.</W> TheEnd
probaré con la versión oficial p007
comment:7 Changed 13 years ago by
Las fechas por defecto se utilizan para decidir que un conjunto temporal es vacío.
No hay ninguna forma analítica de saber si un conjunto temporal es vacío o no.
Haría falta una herramienta de cálculo simbólico capaz de manejar con entidades abstractas que no hemos sabido ni tan siquiera imaginar hasta ahora.
Si intentas efectuar operaciones de sucesión o predecesión dentro de un conjunto que es vacío entonces puedes entrar en un ciclo infinito, aunque en la práctica se pararía siempre en TheBegin o TheEnd. Aún así resultaría demasiado lento por lo que se emplean reglas heurísticas para decidir si se aborta el ciclo de búsqueda dando por hecho que el conjunto es vacío. En esas reglas se tienen en cuenta las fechas por defecto y es posible que si estás operando muy lejos de ellas te encuentres con falsos negativos como éste.
Recientemente se ha podido cambiar algo que afecte a eses reglas y es lo que habrá que mirar.
comment:8 Changed 13 years ago by
Resolution: | → fixed |
---|---|
Status: | reopened → closed |
comment:10 Changed 13 years ago by
Persiguiendo el error #1462 hice cambios que me parecían sensatos y que aceleraban alguna cosa, pero que por lo que se ve dan este tipo de problemas con mayor probabilidad.
Con la versión oficial actual
v3.1 p007 2012-03-15 19:31:11 i686-win
yo no consigo reproducir ese problema aunque es muy posible que haya estado ese error en alguna versión anterior.