Недостаточно строкового пространства в Visual Basic 6

StackOverflow https://stackoverflow.com/questions/93932

  •  01-07-2019
  •  | 
  •  

Вопрос

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

Thks, AK

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top