Estructuras que sobrepasen los 64Kbytes

Tratamiento de estructuras en visual basic 6.0
? Proyecto en Visual Basic 6.0 en el cual se definen dos estructuras de datos dentro de un modulo .vas:
Public Const NUM_PTOS As Integer = 3600
-Estructura 1:
Public Type strucFich
numeropuntos As Long
alfa(1 To NUM_PTOS) As Double
radio(1 To NUM_PTOS) As Double
End Type
Public fich As strucFich
- Estructura 2:
Public Type strucXY
numeropuntos As Long
x(1 To NUM_PTOS) As Double
y(1 To NUM_PTOS) As Double
End Type
Public levaXY As strucXY
Cada estructura contiene un total de 57.604 bytes (4+28.800+28.800)
? Se define una función que recibe una estructura del tipo strucFich y devuelve una estructura del tipo strucXY:
Public Function kk(fich As strucFich) As strucXY
kk = levaXY
End Function
? Desde un modulo de programa, se llama a la función:
levaXY = kk(fich)
? Al ir a ejecutar el programa se produce el siguiente error:
! Compile error:
Too many local, nonstatic variables
Aceptar Ayuda
? La ayuda a dicho error indica:
Too many local, nonstatic variables
Local, nonstatic variables are variables that are defined within a procedure and reinitialized each time the procedure is called. This error has the following cause and solution:
? The sum of the memory requirements for this procedure's local, nonstatic variables and compiler-generated temporary variables exceeds 32K.
Declare some of your variables with the Static statement where appropriate. Static variables retain their value between procedure invocations because they are allocated from different memory resources than nonstatic variables.
Si intentamos definir como static las variables, no nos lo permite.
? Pregunta: ¿Es posible trabajar dentro de un procedimiento con grupos de estructuras que sobrepasen los 64Kbytes?
Respuesta
1
Te cuento:
No sé los conocimientos de programación orientada a objetos que tienes, pero voy a tratar de explicarme lo mejor posible.
VB puede almacenar las variables de cualquier procedimiento o módulo en dos sitios de la memoria distintos: la pila (stack) y el montículo (heap). En el primero se almacenan todas las variables que no son referencia a objetos, es decir, las variables de tipos simples o las que pertenecen a tipos definidos por el usuario, como son las de tu problema. Este lugar está limitado a 64 kb por procedimiento, y no se puede modificar (al menos, yo no he podido). La orientación a objetos tiende a dejar de usar estas variables, sobre todo los tipos definidos por el usuario, y a definir objetos, que se manejan de una forma muy parecida a estos tipos, y que se almacenan en el montículo. El espacio en el montículo está limitado por la memoria del sistema, y esto es mucho.
Te recomiendo que hagas lo siguiente: transforma los tipos que tienes definidos por clases de objetos, y manéjalos de la misma forma. Vas a tener un pequeño problema, y es que el lenguaje no te va a permitir definir como Public las matrices de DOUBLE que tienes. Te recomiendo que hagas lo siguiente: define las variables alfa, radio, por e y como Variant, para que puedas hacerlas Public, y en el evento Initialize de la clase redimensiónalos (con REDIM) como en este ejemplo:
REDIM x(1 to NUM_PUNTOS) as Double
Ya te digo, no sé hasta qué punto llegan tus conocimientos sobre orientación a objetos, me gustaría que me informaras de cualquier problema que te pueda surgir.

3 respuestas más de otros expertos

Respuesta
1
Lo primero que debo decirte es que hace tiempo que no trabajo con VB, y ahora mismo no recuerdo bien hasta que capacidad se podía trabajar con estructuras, pero creo que ese no es el problema, que si no seria absurdo.
Por otro lado, ¿has probado a crearte otra estructura auxiliar que sirva de punto intermedio?.
SI las estructuras tienen el mismo formato y son del mismo tipo, no debería dar error, pero otra solución seria crearte un método al estilo de un cint() para que convierta automáticamente cada campo de la estructura, ya que es posible que al pasar de una estructura a otra pierda algún valor o formato.
Pero como ya te he dicho, hace mucho tiempo que deje de trabajar con VB (ahora trabajo con Java) y ya no recuerdo bien.
Lo siento y un saludo.
Respuesta
1
Es evidente que la suma de la memoria necesaria para todas las variables a nivel de módulos(Procedimientos, funciones, Etc). No debería superar las 64k.
Deberías declarar las funciones y variables como Static o dividir más el modulo y/o los procedimientos.
Aunque tengo que decirte que a veces Visual da estos problemas y no son derivados sólo del procedimiento o código en si. Me explico un programa residente en mal funcionamiento puede generar el mismo código de error en ejecución con un proyecto visual o demasiados programas residentes. O también demasiados controladores de dispositivos cargados en memoria.
Aunque sólo he visto una parte de tú aplicación que es supongo donde te genera definitivamente el error deberías mirar si el módulo entero (todo el proyecto de ejecución primaria) es demasiado largo, yo creo que en un principio deberías optar por subdividir. En las líneas de código que me has mandado sobre todo en la definición de la estructura de datos yo en un principio no veo nada raro.
Respuesta
1
Yo he probado tu ejemplo y me ocurre lo mismo. Según Microsoft tu problema viene dado por:
"Los datos fijos y estáticos incluyenvariables, no automáticas, cadenas de longitud fija ymatrices fijas. Las causas y posibles soluciones de este error son las siguientes:
Ha intentado asignar más de 64 K de datos denivel de módulo.
Reduzca la cantidad de datos declarados. Note que a pesar de que el límite para el tamaño de los datos a nivel de módulo es de 64K, las cadenas de longitud variable del nivel de módulo y las matrices pueden exceder este límite.
Ha intentado asignar más de 64K de datos denivel de procedimiento estático en elmódulo.
Reduzca la cantidad de datos de este tipo declarados. Los datos estáticos de todos losprocedimientos que están en un módulo están limitados a un total de 64K (no 64K por procedimiento). Note que las cadenas estáticas de longitud variable y las matrices pueden exceder este límite.
El tamaño de untipo definido por el usuario no puede exceder 64 K.
Reduzca el tamaño del tipo definido por el usuario. Generalmente, el tamaño de un tipo definido por el usuario es igual a la suma de los tamaños especificados para sus elementos (en algunas plataformas, puede incluirse relleno entre los elementos para mantenerlos alineados en márgenes de texto). Además, sin anida un tipo definido por el usuario dentro de otro, el tamaño del tipo anidado debe incluirse en el tamaño del nuevo tipo.
En un procedimiento, intentó declarar una variable de tipo definido por el usuario que requiere más de 32 K.
Aunque el límite de tamaño de una variable de tipo definido por el usuario es de 64K a nivel de módulo, las variables de tipo definido por el usuario en procedimientos no puede superar los 32K. Reduzca el tamaño necesario para este tipo definido por el usuario, o utilice una variable a nivel de módulo.
El tamaño de una cadena de longitud fija declarada dentro de un procedimiento no puede exceder 65.464.
Reduzca la longitud de la cadena de longitud fija. Observe que las cadenas de longitud fija pueden exceder este límite."
Después de esta explicación de Microsoft me vienen a la cabeza algunas preguntas para intentar ayudarte.
El valor de la constante NUM_PTOS = 3600. ¿Seria posible reducirlo? ¿Podría ser un tamaño variable (Para usar matrices dinámicas en lugar de matrices estáticas)? ¿Qué pretendes hacer (quizás se pueda resolver de otro modo)?. Estoy interesado en ayudarte a resolver este problema, ya que lo considero muy interesante.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas