2008-09-18 6 views
9

Une application VB6 qui envoie des données sur des sockets TCP génère une erreur. Nous obtenons une erreur d'exécution "hors de l'espace de chaîne". Quelqu'un a-t-il vu cela ou a-t-il des idées sur la raison pour laquelle cela se produirait? On dirait que nous touchons un seuil VB6 donc toute autre idée serait utile aussi.En dehors de l'espace chaîne dans Visual Basic 6

thks, ak

+0

Pourriez-vous coller le code autour de la ligne qui renvoie l'erreur? – Robit

+0

Les déclarations des variables impliquées peuvent aussi être utiles. – Robit

Répondre

10

Comme d'autres l'ont souligné, chaque concaténation de chaîne dans VB allouera une nouvelle chaîne, puis copier les données sur puis désallouer la fois originale possible. Dans une boucle, cela peut causer des problèmes.

Pour contourner cela, vous pouvez créer une simple classe StringBuilder comme celui-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 réduira au minimum le nombre d'allocations de chaîne en forçant la chaîne à construire avec des espaces, puis en écrasant le espaces au besoin. Il réaffecte à peu près le double de sa taille lorsqu'il constate qu'il n'a pas assez d'espace pré-initialisé. La méthode Text retournera la partie de la chaîne réellement utilisée.

+3

Vous devez utiliser les versions $ des fonctions lorsqu'elles sont disponibles. Sinon génial classe StringBuilder :) – rpetrich

+0

Ce générateur de chaîne est beaucoup plus rapide et pourrait éviter les erreurs "hors de l'espace de chaîne": http://www.vbaccelerator.com/home/VB/Code/Techniques/StringBuilder/article.asp – MarkJ

2

texte trouvé sur MSDN:

http://msdn.microsoft.com/en-us/library/aa264524(VS.60).aspx

Visual Basic pour Applications Référence d'espace chaîne (erreur 14)

Specifics

Visual Basic vous permet d'utiliser très grandes chaînes. Cependant, les exigences d'autres programmes et la façon dont vous manipulez vos chaînes peuvent provoquer cette erreur. Cette erreur a les suivantes causes et solutions:

  • expressions exigeant que les chaînes temporaires pour créer l'évaluation peut provoquer cette erreur. Pour exemple, le code suivant provoque une erreur de dépassement de l'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 

sont alloués.

Supprimez toutes les applications inutiles de la mémoire pour créer plus d'espace.

Pour plus d'informations, sélectionnez l'article en question et appuyez sur F1.

0

En supposant que vous ajoutez des données dans une boucle, assurez-vous qu'elles ne sont pas ajoutées à elles-mêmes, ce qui entraînera une perte de mémoire extrêmement rapide.

Exemple et description du sens d'erreur: http://msdn.microsoft.com/en-us/library/aa264524.aspx

0

Il semble que vous ajoutiez souvent une chaîne. Vous pouvez essayer d'utiliser un StringBuilder class

En outre, il se peut que vous ayez des objets périmés contenant des chaînes qui ne sont pas utilisées et qui doivent être libérées. En recherchant des références circulaires peut-être en enregistrant l'allocation d'objet/libère dans Class_Initialize/Class_Finalize

2

Ajout à la réponse de Jacco, vbAccelerator a une grande classe String Builder qui accomplit à peu près la même chose mais est un peu plus robuste. L'auteur passe également en revue la solution expliquant comment cela fonctionne.

0

Au printemps 2009, Microsoft a fait une mise à jour XP qui interfère avec l'emballage Armadillo/Silicon Realms. La ligne de code qui lançait l'erreur 14, Out of String n'était pas logique. Il n'y avait pas de problème avec une chaîne surdimensionnée. C'était une tâche simple que j'ai même changée pour être «foo» et l'erreur 14 s'est produite toujours. Je pense que l'erreur est mappée incorrectement dans XP. La réponse pour nous était de retirer copyMem-11 du projet de protection Armadillo et remballer l'exe.

Questions connexes