2008-09-18 27 views
9

Estamos obteniendo un error en una aplicación VB6 que envía datos hacia adelante y hacia atrás sobre 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.Fuera de String Space en Visual Basic 6

thks, ak

+0

¿Podría pegar el código alrededor de la línea que devuelve el error? – Robit

+0

Las declaraciones de las variables involucradas también podrían ser útiles – Robit

Respuesta

10

Como otros han señalado, cada concatenación de cadenas en Visual Basic se asignará una nueva cadena y luego copiar los datos a lo largo y luego desasignar el original una vez que se pueda. En un ciclo esto puede causar problemas.

Para evitar este puede crear una clase StringBuilder sencilla como ésta:

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 reducirá al mínimo el número de asignaciones de cadena forzando la cadena que se construirá con espacios en él y luego sobrescribir el 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.

+3

Debe usar las $ versiones de las funciones donde estén disponibles. De lo contrario, gran clase de StringBuilder :) – rpetrich

+0

Este generador de cadenas es mucho más rápido y podría evitar los errores de "espacio de cadena": http://www.vbaccelerator.com/home/VB/Code/Techniques/StringBuilder/article.asp – MarkJ

2

texto que se encuentra en MSDN:

http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx

Visual Basic para Aplicaciones referencia a partir de espacio de cadena (error 14)

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:

  • expresiones que requieren que las series temporales para crear evaluación puede causar este error. Para ejemplo, el código siguiente hace que un error de falta de espacio 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 

están asignando.

Elimine las aplicaciones innecesarias de la memoria para crear más espacio.

Para obtener información adicional, seleccione el elemento en cuestión y presione F1.

0

Parece que va a anexar una cadena a menudo. Puede intentar usar un StringBuilder class

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. Compruebe si hay referencias circulares quizá por la tala objeto de asignación/libera en Class_Initialize/Class_Finalize

2

Agregando a la respuesta de Jacco, vbAccelerator tiene una gran clase Generador de cadenas que lleva a cabo la misma cosa, pero es un poco más robusto. El autor también repasa la solución explicando cómo funciona.

0

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, 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.

Cuestiones relacionadas