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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top