Opened 12 years ago
Last modified 12 years ago
#1689 accepted defect
Tol se cae al hacer un WriteLn("Texto " << Set a) cuando el conjunto a contiene NameBlocks complejos
Reported by: | jmarinero | Owned by: | Víctor de Buen Remiro |
---|---|---|---|
Priority: | normal | Milestone: | Mantainance |
Component: | Kernel | Version: | 3.1 |
Severity: | normal | Keywords: | |
Cc: |
Description (last modified by )
Buenas
Desde hace algún tiempo he notado que hay un problema con la función WriteLn. Es muy común, intentado hacer debug del código, ver el contenido de un conjunto haciendo un WriteLn y añadiendo un conjunto al texto a mostrar.
Si el conjunto contiene NameBlocks, tol, en ocasiones, se viene abajo. Depende del nameblock. He comprobado que falla con estimaciones, previsiones, variables (de un modelo), pero he comprobado que funciona para Set [[ NameBlock BabelTool ]]
(en cuyo caso, muestra todos los contenidos del nameblock BabelTool hasta no sé cuál nivel de recursividad. Creo que muestra todas las cadenas de texto que hay dentro del NameBlock.
Independientemente del comportamiento que se decida para WriteLn en el caso de atacar un nameblock, agradecería que se solucionase el problema de la caída de Tol.
Muchas gracias, un saludo.
Change History (3)
comment:1 Changed 12 years ago by
Description: | modified (diff) |
---|---|
Status: | new → accepted |
comment:2 Changed 12 years ago by
comment:3 Changed 12 years ago by
Fundamentalmente, el motivo es hacer debug.
Me he explicado mal, además. No me interesa volcar el contenido de un NameBlock, si no averiguar los valores de variables. Normalmente, esto lo utilizo cuando estoy dentro de un conjunto de bucles (evalsets) anidados y una de las (posiblemente miles o decenas de miles de ) iteraciones falla y no sé cuál.
Para poder averiguar en qué iteración falla, lo que hago es utilizar un WriteLn que me indica el valor de los elementos que se están utilizando en cada iteración y que me permite ver qué es lo último que se ha escrito justo antes de fallar. Así que lo que necesito escribir es el nombre del nameblock (cuando un nameblock es la variable sobre la que corre uno de los evalset), no su contenido.
Un saludo
El problema es que se intenta crear un texto demasiado grande y se cae el asignador de memoria de windows.
Entiendo que esto pude ocurrir perfectamente si el NameBlock (o el Set) es muy grande o tiene referencias recursivas, es decir, hay elementos que referencian a otros que a su vez referencian al primero o mediante un tercero, o un cuarto, etc. En este caso se cae en un ciclo infinito por lo que antes o después se quedará sin RAM.
No creo que haya ninguna posible solución al respecto y tampoco veo la utilidad de volcar un NameBlock gigantesco a la pantalla de texto cuando es mucho más eficaz explorarlo en el interfaz de TolBase.