2008-09-18 32 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。