2008-09-18 33 views
9

我們在通過TCP套接字來回發送數據的VB6應用程序中發生錯誤。我們得到一個「超出字符串空間」的運行時錯誤。有沒有人看到這個或有任何想法,爲什麼會發生?似乎我們正在觸及一些VB6的門檻,所以任何其他的想法也會有所幫助。在Visual Basic 6中超出字符串空間

THKS, AK

+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應用程序 參考輸出的字符串空間(錯誤 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

聽起來好像你經常追加一個字符串。你可以嘗試使用StringBuilder class

此外,它可能是你有一些陳舊的對象,包含掛在周圍沒有被使用,應該被釋放的字符串。檢查循環引用可能是通過記錄對象分配/釋放Class_Initialize/Class_Finalize

2

添加到Jacco的響應中,vbAccelerator有一個很棒的String Builder類,它完成了大致相同的事情,但是更加健壯一些。作者還介紹瞭解決方案的工作原理。

0

在2009年春天的某個時候,微軟做了一次XP更新,干擾了Armadillo/Silicon Realms包裝。 拋出錯誤14,超出字符串空間的代碼行不合邏輯。超大尺寸的字符串沒有問題。這是一個簡單的任務,我甚至改變爲「富」,錯誤14仍然發生。我認爲錯誤在XP中映射不正確。 我們的答案是從Armadillo保護項目中移除copyMem-11並重新包裝exe。