Pergunta

Estamos recebendo um erro em um aplicativo VB6 que envia de volta dados e para trás sobre sockets TCP. Obtemos um erro de execução "fora do espaço de cadeia". Alguém viu isso ou tem alguma opinião sobre por que isso iria acontecer? Parece que estamos acertando alguns threshhold VB6 assim quaisquer outros pensamentos seria útil também.

thks, ak

Foi útil?

Solução

Como outros apontaram, cada concatenação em VB irá alocar uma nova seqüência e, em seguida, copiar os dados sobre e depois de-alocar o original, uma vez que pode. Em um loop isso pode causar problemas.

Para contornar isso, você pode criar uma classe StringBuilder simples 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 classe irá minimizar o número de alocações de corda, forçando a corda a ser construída com espaços e, em seguida, substituir os espaços conforme necessário. Ele re-aloca para duplicar aproximadamente o seu tamanho quando se descobre que ele não tem espaço suficiente pré-inicializada. O método de texto retornará a parte da cadeia de caracteres que é realmente usado.

Outras dicas

Texto encontrado na MSDN:

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

Visual Basic for Applications Referência Fora do espaço de seqüência (Error 14)

Específicos

Visual Basic permite que você use muito grandes cordas. No entanto, o requisitos de outros programas eo maneira que você manipular suas cordas pode causar esse erro. Este erro tem a seguinte causas e soluções:

  • Expressões exigindo que cadeias temporárias ser criada para avaliação pode causar esse erro. Para exemplo, o código seguinte faz com que um Erro de falta de espaço de cadeia em algum sistemas operacionais:
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

sendo alocados.

Remova todas as aplicações desnecessárias da memória para criar mais espaço.

Para obter informações adicionais, selecione o item em questão e pressione F1.

Somando-se a resposta de Jacco, VBAccelerator tem uma grande classe string Builder que realiza a mesma coisa, mas é um pouco mais robusto. O autor também anda através da solução explicando como funciona.

Assumindo que você está anexando dados em um loop, garantir que ele não está sendo anexado a si mesmo, o que vai comer de memória de forma extremamente rápida.

Exemplo e descrição do significado de erro: http://msdn.microsoft.com/en-us/library/aa264524. aspx

Em algum momento na primavera de 2009, a Microsoft fez uma atualização XP que interfere com Silicon Realms Armadillo / wrapper. A linha de código que estava jogando de erro 14, fora do espaço da corda não era lógico. Não havia nenhum problema com uma corda de tamanho mais. Era uma tarefa simples que eu mesmo alterado para ser "foo" e erro 14 ainda ocorrido. Eu acho que o erro é mapeado incorretamente no XP. A resposta para nós era remover copyMem-11 do projeto de proteção Armadillo e embrulhe o exe.

Parece que você está anexando uma string muitas vezes. Você pode tentar usar um StringBuilder classe

Além disso, pode ser que você tem alguns objetos obsoletos que contêm cordas penduradas em torno de que não estão sendo usados ??e deve ser liberado. Verifique se há referências circulares talvez por alocação de objeto de registro / libera na Class_Initialize/Class_Finalize

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top