سؤال

يمكنني استخدام المشغل () كمشغل ترجمي بهذه الطريقة:

double CVector::operator() (int i) const
{
 if (i >= 0 && i < this->size)
  return this->data[i];
 else
  return 0;
}

double& CVector::operator() (int i)
{
 return (this->data[i]);
}

إنه يعمل عندما أحصل على القيم ، لكنني أحصل على خطأ عندما أحاول كتابة تعيين قيمة باستخدام

a(i) = 1;

تحديث: نص الخطأ:

استثناء غير معبأ في 0x651CF54A (MSVCR100D.DLL) في CG.EXE: 0xC0000005: موقع انتهاك الوصول 0xCCCCCC0.

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

المحلول

كما قلت في تعليقي ، المشكلة هي تصميمك المعيب. أقوم بتقديم ضمان بنسبة 100 ٪ على أحد شيئين:

  1. القيمة التي تنقلها إلى وظيفة المهمة خارج نطاق صالح.
  2. عضو data يشير إلى مساحة غير صالحة في الذاكرة.

في كلتا الحالتين ، أود أن أقترح إضافة:

#include <cassert>

وإضافة assert(i >= 0 && i < this->size) بدلا من الإخفاقات الصامتة:

double CVector::operator() (int i) const
{
    assert(i >= 0 && i < this->size);
    return this->data[i];
}

double& CVector::operator() (int i)
{
    assert(i >= 0 && i < this->size);
    return (this->data[i]);
}

نصائح أخرى

ذلك لأنك لم تنفذ معالجة الأخطاء double& CVector::operator() (int i) كما فعلت للوظيفة الأخرى التي تتفوق على الأحمال الزائدة ().

تغييره إلى:

double& CVector::operator() (int i)
{
 if (i >= 0 && i < this->size)
 {
  return this->data[i];
 }
 else // Whatever manner you want to gracefully exit the program
 {
  std::cout<<"Out of bounds!"<<endl;
  exit(1);
 }
}

يجب عليك أيضًا التفكير في تغيير آلية معالجة الأخطاء في الوظيفة الأخرى من return 0; لشيء أكثر معنى.

استثناء غير معبأ في 0x651CF54A (MSVCR100D.DLL) في CG.EXE: 0xC0000005: موقع انتهاك الوصول 0xCCCCCC0.

0xcc هي قيمة بايت الذاكرة MSVC. بمعنى آخر ، تكون مشكلتك على الأرجح بسبب الوصول إلى مؤشر غير ضروري أو مؤشر مستمد من ذاكرة غير مهتم.

المشكلة هي أنك لا تتحقق من فهرس خارج المدى في double& نسخة من operator().

ربما لا يمكنك ضمان ذلك data[i] يشير إلى عنوان ذاكرة صالح لكبير بما يكفي i. يجب عليك إما التحقق من الفهرس خارج المدى ورمي بعض الاستثناءات أو تغيير حجم المتجه الخاص بك (عن طريق تخصيص المزيد من الذاكرة data) لتكون قادرة على الاحتفاظ بمزيد من القيم.

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