Sin espacio para cadenas en Visual Basic 6
Pregunta
Recibimos un error en una aplicación VB6 que envía datos de un lado a otro a través de sockets TCP.Obtenemos un error de tiempo de ejecución "sin espacio en la cadena".¿Alguien ha visto esto o tiene alguna idea de por qué sucedería esto?Parece que estamos alcanzando cierto umbral de VB6, por lo que cualquier otra idea también sería útil.
Thks, AK
Solución
Como otros han señalado, cada concatenación de cadenas en VB asignará una nueva cadena y luego copiará los datos y luego desasignará el original una vez que pueda.En un bucle, esto puede causar problemas.
Para solucionar este problema, puede crear una clase StringBuilder simple como esta:
Option Explicit
Private data As String
Private allocLen As Long
Private currentPos As Long
Public Function Text() As String
Text = Left(data, currentPos)
End Function
Public Function Length() As Long
Length = currentPos
End Function
Public Sub Add(s As String)
Dim newLen As Long
newLen = Len(s)
If ((currentPos + newLen) > allocLen) Then
data = data & Space((currentPos + newLen))
allocLen = Len(data)
End If
Mid(data, currentPos + 1, newLen) = s
currentPos = currentPos + newLen
End Sub
Private Sub Class_Initialize()
data = Space(10240)
allocLen = Len(data)
currentPos = 1
End Sub
Esta clase minimizará la cantidad de asignaciones de cadenas al forzar que la cadena se construya con espacios y luego sobrescribir los espacios según sea necesario.Lo reasigna para aproximadamente duplicar su tamaño cuando descubre que no tiene suficiente espacio preinicializado.El método Text devolverá la parte de la cadena que realmente se utiliza.
Otros consejos
Texto encontrado en MSDN:
http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx
Visual Basic para aplicaciones referencia fuera del espacio de cadena (Error 14)
Detalles específicos
Visual Basic le permite usar cuerdas muy grandes.Sin embargo, los requisitos de otros programas y la forma en que manipula sus cuerdas pueden causar este error.Este error tiene las siguientes causas y soluciones:
- Las expresiones que requieren que se creen cadenas temporales para la evaluación pueden causar este error.Por ejemplo, el siguiente código provoca un error de espacio fuera de cadena en algunos sistemas operativos:
MyString = "Hello"
For Count = 1 To 100
MyString = MyString & MyString
Next Count
Assign the string to a variable of another name. * Your system may have run out of memory, which prevented a string from
siendo asignado.
Elimine cualquier aplicación innecesaria de la memoria para crear más espacio.
Para obtener información adicional, seleccione el elemento en cuestión y presione F1.
Agregando a la respuesta de Jacco, vbAcelerador tiene una excelente clase String Builder que logra prácticamente lo mismo pero es un poco más sólida.El autor también analiza la solución y explica cómo funciona.
Suponiendo que está agregando datos en un bucle, asegúrese de que no se agreguen a sí mismos, lo que consumirá memoria extremadamente rápido.
Ejemplo y descripción del significado del error:http://msdn.microsoft.com/en-us/library/aa264524.aspx
En algún momento de la primavera de 2009, Microsoft realizó una actualización de XP que interfiere con el contenedor Armadillo/Silicon Realms.La línea de código que arrojaba el error 14, Fuera del espacio de cadena, no era lógica.No hubo ningún problema con una cuerda de gran tamaño.Fue una tarea simple que incluso cambié para que fuera "foo" y aún así se produjo el error 14.Creo que el error está asignado incorrectamente en XP.La respuesta para nosotros fue eliminar copyMem-11 del proyecto de protección Armadillo y volver a empaquetar el archivo ejecutable.
Parece que estás agregando una cadena con frecuencia.Podrías intentar usar un Clase StringBuilder
Además, es posible que tenga algunos objetos obsoletos que contengan cadenas que no se estén utilizando y que deban liberarse.Compruebe si hay referencias circulares, tal vez registrando la asignación/liberaciones de objetos en Class_Initialize/Class_Finalize