Недостаточно места в Visual Basic 6 - PullRequest
10 голосов
/ 18 сентября 2008

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

Thks, ак

Ответы [ 6 ]

11 голосов
/ 18 сентября 2008

Как отмечали другие, каждая конкатенация строк в 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 голосов
/ 18 сентября 2008

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

2 голосов
/ 18 сентября 2008

Текст найден в 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.

0 голосов
/ 25 августа 2009

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

0 голосов
/ 18 сентября 2008

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

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

0 голосов
/ 18 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...