TCP ソケットを介してデータをやり取りする VB6 アプリケーションでエラーが発生しています。「文字列スペースが不足しています」という実行時エラーが発生します。誰かがこれを見たことがありますか、またはなぜこれが起こるのか考えていますか? VB6 のしきい値に達しているように見えるので、他の考えも役に立ちます。
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
このクラスは、文字列にスペースを入れて作成し、必要に応じてスペースを上書きすることで、文字列の割り当て数を最小限に抑えます。事前に初期化された十分なスペースがないことが判明すると、サイズが約2倍になるように再割り当てされます。Textメソッドは、実際に使用されている文字列の部分を返します。
MSDNで見つかったテキスト:
http://msdn.microsoft.com/en-us/library/aa264524(VS.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キーを押してください。
Jaccoの回答に加えて、vbAcceleratorには優れた String Builder クラスがあり、ほとんど同じことを実現しますが、もう少し堅牢です。また、著者は、その仕組みを説明するソリューションについても説明します。
ループでデータを追加していると仮定して、データがそれ自体に追加されていないことを確認します。これにより、メモリが非常に急速に消費されます。
エラーの意味の例と説明:http: //msdn.microsoft.com/en-us/library/aa264524.aspx
It sounds like you are appending a string often. You could try using a StringBuilder class
Also, it could be you have some stale objects that contain strings hanging around that aren't being used and should be freed. Check for circular references perhaps by logging object allocation/frees in Class_Initialize/Class_Finalize
2009 年の春に、Microsoft は XP の更新を行い、Armadillo/Silicon Realms ラッパーに干渉しました。エラー 14 をスローしていたコード行は、文字列領域が不足していました。オーバーサイズのストリングでも問題ありませんでした。「foo」に変更してもエラー14が発生するという単純な割り当てでした。XPでエラーが正しくマッピングされていないと思います。私たちの答えは、Armadillo 保護プロジェクトから copyMem-11 を削除し、exe を再ラップすることでした。