2008-09-18 3 views
9

Мы получаем ошибку в приложении VB6, которое отправляет данные взад и вперед по TCP-сокетам. Мы получаем ошибку времени выполнения из строкового пространства. Кто-нибудь видел это или думал о том, почему это произойдет? Похоже, мы бьем какой-то VB6, поэтому любые другие мысли также будут полезны.Out of String Space в Visual Basic 6

Thks, ак

+0

Не могли бы вы вставить код вокруг строки, которая возвращает ошибку? – Robit 2008-09-18 16:05:00

+0

Значения соответствующих переменных также могут быть полезны – Robit 2008-09-18 16:06:03

ответ

10

Как уже отмечалось, каждая конкатенация в VB выделит новую строку, а затем скопировать данные снова и затем отмены размещения оригинала, как только это возможно. В цикле это может вызвать проблемы.

Чтобы обойти эту проблему можно создать простой класс StringBuilder, как этот:

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 

Этот класс позволит свести к минимуму количество строк распределения, заставляя строку быть построен с пробелами в нем, а затем перезаписывания при необходимости. Он переназначает примерно вдвое больше его размера, когда обнаруживает, что он не имеет достаточного пространства, предварительно инициализированного. Метод Text вернет часть используемой строки.

2

Текст найден на MSDN:

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

Visual Basic для приложений задание из строки пространства (Error 14)

Особенности

Visual Basic позволяет вам использовать очень большие строки . Тем не менее, требования других программ и способ управления вашими строками могут вызвать эту ошибку. Эта ошибка имеет следующие причины и решения:

  • выражения, требующие, чтобы временные строки быть созданы для оценки может вызвать эту ошибку. Для Например, следующий код вызывает из космоса ошибки строки на некоторых операционных систем:
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 

выделяется.

Извлеките ненужные приложения из памяти, чтобы создать дополнительное пространство для .

Для получения дополнительной информации, выберите нужный пункт и нажмите F1.

0

Предполагая, что вы добавляете данные в цикл, убедитесь, что он не добавлен к себе, что очень быстро съест память.

Пример и описание значения ошибки: http://msdn.microsoft.com/en-us/library/aa264524.aspx

0

Похоже, вы часто добавляете строку. Вы можете попробовать использовать StringBuilder class

Кроме того, у вас могут быть некоторые устаревшие объекты, которые содержат зависающие строки, которые не используются и должны быть освобождены. Проверьте циркулярные ссылки, возможно, путем регистрации размещения/освобождения объекта в Class_Initialize/Class_Finalize

2

Добавив к ответу Яко, vbAccelerator имеет отличный класс String Builder, который выполняет почти то же самое, но немного более надежный. Автор также просматривает решение, объясняющее, как это работает.

0

Когда-то весной 2009 года Microsoft сделала обновление XP, которое мешало оболочке Armadillo/Silicon Realms. Строка кода, которая выдавала ошибку 14, Out of String была не логичной. Не было проблем с строкой большего размера. Это простое задание, которое я даже изменил, чтобы быть «foo», и ошибка 14 все еще имела место. Я думаю, что ошибка неверно отображается в XP. Ответ для нас заключался в том, чтобы удалить copyMem-11 из проекта защиты Armadillo и переустановить exe.

 Смежные вопросы

  • Нет связанных вопросов^_^