سؤال

لقد حصلنا على خطأ في تطبيق VB6 الذي يرسل البيانات ذهابًا وإيابًا عبر مآخذ توصيل TCP.لقد حصلنا على خطأ في وقت التشغيل "نفاد مساحة السلسلة".هل رأى أحد هذا أو لديه أي أفكار حول سبب حدوث ذلك؟يبدو أننا وصلنا إلى عتبة VB6 لذا فإن أي أفكار أخرى ستكون مفيدة أيضًا.

thks ، حزب العدالة والتنمية

هل كانت مفيدة؟

المحلول

كما أشار الآخرون، فإن كل سلسلة سلسلة في 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 جزء السلسلة المستخدم بالفعل.

نصائح أخرى

تم العثور على النص على 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.

إضافة إلى رد جاكو، vbAccelerator لديه فئة String Builder الرائعة التي تنجز نفس الشيء تقريبًا ولكنها أقوى قليلاً.يستعرض المؤلف أيضًا الحل موضحًا كيفية عمله.

بافتراض أنك تقوم بإلحاق البيانات في حلقة، تأكد من عدم إلحاقها بنفسها، مما سيؤدي إلى استهلاك الذاكرة بسرعة كبيرة.

مثال ووصف معنى الخطأ:http://msdn.microsoft.com/en-us/library/aa264524.aspx

في وقت ما في ربيع عام 2009، قامت Microsoft بإجراء تحديث XP الذي يتداخل مع غلاف Armadillo/Silicon Realms.سطر التعليمات البرمجية الذي كان يعرض الخطأ 14، لم تكن المساحة خارج السلسلة منطقية.لم تكن هناك مشكلة مع سلسلة كبيرة الحجم.لقد كانت مهمة بسيطة حتى أنني قمت بتغييرها إلى "foo" وما زال الخطأ 14 يحدث.أعتقد أنه تم تعيين الخطأ بشكل غير صحيح في XP.كان الجواب بالنسبة لنا هو إزالة CopyMem-11 من مشروع حماية Armadillo وإعادة تغليف ملف exe.

يبدو أنك تقوم بإلحاق سلسلة في كثير من الأحيان.يمكنك تجربة استخدام أ فئة StringBuilder

أيضًا، من الممكن أن يكون لديك بعض الكائنات التي لا معنى لها والتي تحتوي على سلاسل معلقة غير مستخدمة ويجب تحريرها.تحقق من وجود مراجع دائرية ربما عن طريق تسجيل تخصيص/تحرير الكائنات Class_Initialize/Class_Finalize

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top