Estructuras

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?

3 respuestas

1
Respuesta de Anónimo
Hola.
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.
Añade un comentario a esta respuesta
1
Respuesta de
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.
Un saludo.
Añade un comentario a esta respuesta
1
Respuesta de Anónimo
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.
Añade un comentario a esta respuesta
Añade tu respuesta
Haz clic para o
Escribe tu mensaje
¿No es la respuesta que estabas buscando? Puedes explorar otras preguntas de los temas ProgramaciónTecnología e InternetVisual Basic o hacer tu propia pregunta: