Estructuras

Respuesta de
ne2soft
a
Usuario
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?


Experto
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.
Un saludo.