لماذا هو بلدي ناقلات رمز مؤكدا?ما هو تأكيد على أية حال ؟

StackOverflow https://stackoverflow.com/questions/817429

  •  03-07-2019
  •  | 
  •  

سؤال

بالضبط ما هو "تأكيد" ، أو أكثر تحديدا, كيف يمكنني التخلص من خطأ.عند إنشاء متجه من المؤشرات إلى فئة بيانات الأعضاء int x, ثم القيام بذلك:

for(I=antiviral_data.begin();I<antiviral_data.end();I++)
{
    if((*I)->x>maxx)
    {
        antiviral_data.erase(I);
    }
}

و تشغيل البرنامج ، أحصل على أي أخطاء حتى x أكبر من ماكس و يمكنني استخدام .محو () في رسالة الخطأ هذه:

تصحيح التوكيد فشل!

البرنامج:بلدي ...Documents\O.exe ملف:...تشمل\ناقلات خط:116

التعبير:("this->_Has_container()",0)

للحصول على معلومات حول كيفية البرنامج يمكن أن يسبب فشل تأكيد ، انظر وثائق Visual C++ على يؤكد.

(اضغط على "إعادة المحاولة" لتصحيح التطبيق)

[إجهاض][إعادة][تجاهل]

أيضا, إذا حاولت استخدام cout:

cout<<(*antiviral_data.begin())->x<<endl;

يمكنني الحصول على هذا الخطأ:

تصحيح التوكيد فشل!

البرنامج:بلدي ...Documents\O.exe ملف:...تشمل\ناقلات خط:98

التعبير:ناقلات مكرر لا deferencable

للحصول على معلومات حول كيفية البرنامج يمكن أن يسبب فشل تأكيد ، انظر وثائق Visual C++ على يؤكد.

(اضغط على "إعادة المحاولة" لتصحيح التطبيق)

[إجهاض][إعادة][تجاهل]

يمكن شخص من فضلك قل لي لماذا لا أستطيع استخدام أي من البيانات في ناقلات ، وكيفية اصلاحها ؟

أيضا:antiviral_data هو متجه من المؤشرات ، مع عنصر واحد:

antiviral_data.push_back(new aX1(player.x,player.y,'>'));

إذا كان ذلك يساعد.

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

المحلول

الأكثر احتمالا السبب تحصل على التأكيد أن زيادة أنا بعد محو.جرب هذا بدلا من ذلك:

for(I=antiviral_data.begin();I!=antiviral_data.end();)
{
    if((*I)->x>maxx) I=antiviral_data.erase(I); else ++I;
}

انظر أيضا http://www.cppreference.com/wiki/stl/vector/erase البحث عن صالح التكرار في هذه الصفحة.

نصائح أخرى

وهو تأكيد هو عادة تعبير دخلت من قبل المطور على تصحيح الأخطاء لأغراض مكافحة - يمكنك وضع مختلف "التعقل الشيكات" في التعليمات البرمجية الخاصة بك ، ويكون ذلك تحطم البرنامج إذا تحقق لم يتم التوصل إليها.

على سبيل المثال, تخيل كان لديك التعليمات البرمجية التي كان على وشك تقسيم رقمين في مكان ما على الطريق.حتى ولو كنت دائما نتوقع القسمة على الصفر غير, كنت وضعت في تأكيد قبل شعبة في حالة حجة حصلت أخطأت.إذا كان تأكيد فشل يعني مكان ما على الطريق كان هناك فشل.

تأكيدات عادة تظهر فقط في إصدار تصحيح في قانون (إذا كنت تستخدم visual C++ يمكنك تجميع أجل التصحيح وإصدار).أثناء ترجمة في وضع الإصدار سيقضي على النتائج ، هو فكرة سيئة للغاية, منذ كنت لا تزال لديها خطأ وربما حقا نتائج سيئة.

في مكان ما في تنفيذ ناقلات (هل هو قياسي) ، speciifcally في خط 98 ، هناك تأكيد.إذا كان لديك الوصول إلى ناقلات رمز ننظر لنرى ما هو تأكيد أو تصحيح ما يصل إلى هذه النقطة.وهذا يمكن أن يشير إلى خطأ في ناقلات التنفيذ ، أو في رمز المكالمات ناقلات.

الاشياء التي نشرت يعطينا بعض تلميحات عن ما يحدث, ولكن سيكون من المفيد إذا كنت قد لصق أكثر من البرنامج ، بما فيها ناقلات محددة.

المشكلة هي مع محو الاتصال.أنت بالتكرار عبر وعاء و في نفس الوقت محو العناصر من ذلك.بعد إجراء مسح مكرر الخاصة بك يصبح غير صالح.إذا كنت ترغب في إزالة عناصر من قيمة معينة من ناقلات استخدام محو مع remove_if الخوارزمية.هذا هو المعروف باسم محو-إزالة المصطلح وشرح جيد جدا في سكوت ماير فعالة الخاصة بلبنان الكتاب.يمكنك أيضا الرجوع إلى هذا السؤال محو عناصر من ناقلات للحصول على مزيد من المعلومات.

لديك بضع إجابات جيدة عن ما هو تأكيد ولماذا يتم تشغيلها في التعليمات البرمجية الخاصة بك.الآن, قد ترغب في النظر في استخدام الخوارزميات الخاصة بلبنان من تمر المحو.

namespace {
   struct exceeds : public std::unary_function< TheUnknownType*, bool >
   {
      exceeds_max( int max ) : maxx( max ) {}
      bool operator()( TheUnknownType* data ) {
         return data->x < max;
      } 
   private:
      int maxx;
   };
}
void your_function()
{
   std::vector< TheUnknownType* >::iterator new_end;
   new_end = std::remove_if( antiviral_data.begin(), antiviral_data.end(), exceeds(maxx) );
   antiviral_data.remove( new_end, antiviral_data.end() );
}

والميزة الرئيسية هي أن محو العناصر في ناقلات عملية مكلفة.لكل عنصر مسح كافة العناصر من هذا الموقف إلى نهاية ناقلات يجب أن يتم نقل موقف واحد تجاه البداية.العنصر الثاني محو قوة خطوة ثانية من جميع العناصر من هناك...المحكمة الخاصة بلبنان remove_if خوارزمية يؤدي يتحرك مرة واحدة فقط إلى موقف نهائي العودة مكرر واحد الماضية العنصر الأخير لم تتم إزالة العنصر.ثم يمكنك إجراء واحد std::ناقلات<>::إزالة التي لا تحتاج إلى نقل العناصر.

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