Из строкового пространства в Visual Basic 6

Мы получаем ошибку в приложении VB6, которое отправляет данные туда и обратно через сокеты TCP. Мы получаем ошибку во время выполнения "out of string space". Кто-нибудь видел это или есть мысли о том, почему это произойдет? Кажется, что мы достигли порога VB6, поэтому любые другие мысли были бы полезны.

Ответ 1

Как отмечали другие, каждая конкатенация строк в 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 для приложений Ссылка из строкового пространства (ошибка 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.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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