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

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

10
задан gilbertbw 25 July 2019 в 12:04
поделиться

6 ответов

Как другие указали, каждая конкатенация строк в 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

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

11
ответ дан 3 December 2019 в 22:40
поделиться

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

2
ответ дан 3 December 2019 в 22:40
поделиться

Текст нашел на MSDN:

http://msdn.microsoft.com/en-us/library/aa264524 (По сравнению с 60) .aspx

Ссылка Visual Basic for Applications Из строкового пространства (Ошибка 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.

2
ответ дан 3 December 2019 в 22:40
поделиться

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

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

0
ответ дан 3 December 2019 в 22:40
поделиться

Это кажется на добавление строки часто. Вы могли попытаться использовать класс StringBuilder

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

0
ответ дан 3 December 2019 в 22:40
поделиться

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

0
ответ дан 3 December 2019 в 22:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: