Espace insuffisant dans Visual Basic 6
Question
Nous rencontrons une erreur dans une application VB6 qui envoie des données dans les deux sens via les sockets TCP. Nous obtenons une erreur d'exécution "hors de l'espace des chaînes". Quelqu'un a-t-il vu cela ou s'est-il déjà demandé pourquoi cela arriverait? Il semble que nous ayons atteint un seuil de VB6, alors toute autre pensée serait également utile.
thks, ak
La solution
Comme d'autres l'ont fait remarquer, chaque concaténation de chaîne dans VB allouera une nouvelle chaîne, puis copiera les données, puis désallouera l'original une fois qu'elle le pourra. En boucle, cela peut causer des problèmes.
Pour contourner ce problème, vous pouvez créer une classe StringBuilder simple, comme celle-ci:
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
Cette classe minimisera le nombre d'allocations de chaînes en forçant la chaîne à être construite avec des espaces, puis en les écrasant si nécessaire. Il réalloue environ le double de sa taille lorsqu'il constate qu'il ne dispose pas de suffisamment d'espace pré-initialisé. La méthode Text renverra la partie de la chaîne réellement utilisée.
Autres conseils
Texte trouvé sur MSDN:
http://msdn.microsoft.com/ en-us / library / aa264524 (VS.60) .aspx
Visual Basic pour Applications Référence Espace de chaîne insuffisant (Erreur 14)
Particularités
Visual Basic vous permet d'utiliser très grosses cordes. Cependant, le exigences d'autres programmes et de la façon dont vous manipulez vos ficelles peut provoquer cette erreur. Cette erreur a le causes et solutions suivantes:
- Expressions nécessitant la création de chaînes temporaires pour l'évaluation peut provoquer cette erreur. Pour Par exemple, le code suivant provoque un Erreur d'espace de chaîne sur certains systèmes d'exploitation:
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
étant alloué.
Supprimer toutes les applications inutiles de la mémoire pour créer plus d'espace.
Pour plus d'informations, sélectionnez le l'élément en question et appuyez sur F1.
Pour ajouter à la réponse de Jacco, vbAccelerator a une grande classe de constructeur de chaînes qui accomplit à peu près la même chose mais qui est un peu plus robuste. L'auteur analyse également la solution en expliquant son fonctionnement.
En supposant que vous ajoutiez des données dans une boucle, assurez-vous qu'elles ne sont pas ajoutées à elle-même, ce qui absorbera la mémoire très rapidement.
Exemple et description de la signification de l'erreur: http://msdn.microsoft.com/en-us/library/aa264524. aspx
Au printemps 2009, Microsoft a publié une mise à jour de XP qui interfère avec le wrapper Armadillo / Silicon Realms. La ligne de code générant l'erreur 14, l'espace insuffisant en chaîne n'était pas logique. Il n'y avait pas de problème avec une chaîne surdimensionnée. C’était une simple tâche que j’ai même changée pour être "foo". et l'erreur 14 est toujours survenue. Je pense que l'erreur est mal cartographiée sous XP. La solution pour nous était de retirer CopyMem-11 du projet de protection des tatous et de le remballer.
On dirait que vous ajoutez souvent une chaîne. Vous pouvez essayer d'utiliser une la classe StringBuilder
De plus, il se peut que certains objets obsolètes contenant des chaînes qui ne sont pas utilisées et qui doivent être libérés. Recherchez des références circulaires, peut-être en enregistrant les affectations / libérations d'objets dans Class_Initialize / Class_Finalize