operador - substring visual basic
Fuera de String Space en Visual Basic 6 (6)
Estamos obteniendo un error en una aplicación VB6 que envía datos hacia adelante y hacia atrás sobre los sockets TCP. Obtenemos un error de tiempo de ejecución "fuera del espacio de cadena". ¿Alguien ha visto esto o tiene alguna idea sobre por qué esto sucedería? Parece que estamos alcanzando un límite de VB6, por lo que cualquier otro pensamiento sería útil también.
eso, ak
Suponiendo que está agregando datos en un bucle, asegúrese de que no se anexe a sí mismo, lo que consumirá la memoria extremadamente rápido.
Ejemplo y descripción del significado del error: http://msdn.microsoft.com/en-us/library/aa264524.aspx
Texto encontrado en MSDN:
http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx
Referencia de Visual Basic para Aplicaciones Fuera del espacio de cadena (Error 14)
Detalles específicos
Visual Basic le permite usar cadenas muy grandes. Sin embargo, los requisitos de otros programas y la forma en que manipula sus cadenas 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 sin 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.
En algún momento de la primavera de 2009, Microsoft hizo una actualización de XP que interfiere con el envoltorio Armadillo / Silicon Realms. La línea de código que arrojaba el error 14, el espacio Fuera de cadena no era lógico. No hubo problema con una cadena de tamaño excesivo. Fue una asignación simple que incluso cambié para ser "foo" y todavía ocurrió el error 14. Creo que el error está mapeado incorrectamente en XP. La respuesta para nosotros fue eliminar copyMem-11 del proyecto de protección Armadillo y volver a envolver el exe.
Como han señalado otros, cada concatenación de cadenas en VB asignará una nueva cadena y luego copiará los datos y luego des-asignará el original una vez que pueda. En un ciclo esto puede causar problemas.
Para solucionar esto, 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á el número de asignaciones de cadenas al forzar la cadena que se construirá con espacios en ella y luego sobrescribirá los espacios según sea necesario. Se vuelve a asignar a aproximadamente el doble de su tamaño cuando descubre que no tiene suficiente espacio preinicializado. El método de texto devolverá la parte de la cadena que realmente se usa.
Agregando a la respuesta de Jacco, vbAccelerator tiene una gran clase de generador de cadenas que logra casi lo mismo pero es un poco más robusto. El autor también repasa la solución explicando cómo funciona.
Parece que estás añadiendo una cadena a menudo. Podría intentar usar una clase StringBuilder
Además, podría ser que tenga algunos objetos obsoletos que contienen cadenas colgando que no se están utilizando y que deberían liberarse. Verifique referencias circulares tal vez registrando la asignación / frees de Class_Initialize/Class_Finalize
en Class_Initialize/Class_Finalize