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

Était-ce utile?

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

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top