سؤال

إذا كان لدي std::vector أو std::map متغير، وأريد رؤية المحتويات، إنه لأمر مؤلم للغاية رؤية العنصر n أثناء تصحيح الأخطاء.هل هناك مكون إضافي أو خدعة لتسهيل مشاهدة متغيرات حاوية STL أثناء تصحيح الأخطاء (VS2003/2005/2008)?

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

المحلول

بالنسبة للنواقل، هذا خيط في منتديات msdn، يحتوي على مقتطف تعليمات برمجية لإعداد مراقبة على فهرس متجه قد يساعد.

نصائح أخرى

إذا كنت تريد مشاهدة أكثر من عنصر في نفس الوقت، يمكنك إضافة فاصلة وعدد العناصر كما يلي:

(v._Myfirst)[startIndex], count

ومع ذلك، لاحظ أن العدد يجب أن يكون ثابتًا، ولا يمكن أن يكون نتيجة تعبير آخر.

في VS2005 وVS 2008 يمكنك رؤية محتويات حاويات STL.قواعد الحصول على البيانات موجودة في autoexp.dat "c:\Program Files\Microsoft Visual Studio 9\Common7\Packages\Debugger\autoexp.dat".

من المفترض أن يتم تخصيص AutoExp.dat.ومع ذلك، فإن تعريفات STL موجودة ضمن قسم يسمى [Visualizer].إذا تمكنت من معرفة اللغة المستخدمة في هذا القسم، فستوفر لك مزيدًا من القوة، ومع ذلك فإنني أوصي بترك هذا الجزء وحده.

كان Autoexp.dat موجودًا في VS2003، ولكن لم يكن هناك دعم لحاويات STL (لم يكن [Visualizer] موجودًا).في VS2003، يتعين عليك التنقل يدويًا في تمثيل البيانات الأساسية.

من خلال تعديل autoexp.dat، من الممكن إضافة قواعد للتنقل في تمثيل البيانات لأنواعك الخاصة بحيث يسهل تصحيحها.إذا قمت بذلك، فيجب عليك فقط الإضافة إلى العناصر الموجودة ضمن [AutoExp].كن حذرًا واحتفظ بنسخة احتياطية من هذا الملف قبل تعديله.

لعرض العنصر التاسع للحاوية في مصحح أخطاء Visual Studio، استخدم:

container.operator[](n)

يمكنك إنشاء مرئي مخصص تحقق من ذلك: http://www.virtualdub.org/blog/pivot/entry.php?id=120

الطريقة الأكثر بساطة هي أن تقوم بإعداد مؤشر لمشاهدة متغير مثل هذا.

vector<int> a = { 0,1,2,3,4,5 };
int* ptr = &a[0]; // watch this ptr in VisualStudio Watch window like this "ptr,6".

لقد حاولت "a._Myfirst[0]" في VisualStudio2015، ولكن لم يتم عرض بيانات المصفوفة.

إذا كنت تستطيع استخدام "ناتفيس"، وسوف يحل مشاكلك.

هذا هو "sample.natvis" لعرض بيانات std::vector لبرنامج Visual studio 2015.

<?xml version="1.0" encoding="utf-8"?> 
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
  <Type Name="std::vector&lt;*&gt;">
    <DisplayString>{{ size={_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst} }}</DisplayString>
    <Expand>
      <Item Name="[size]" ExcludeView="simple">_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Item>
      <Item Name="[capacity]" ExcludeView="simple">_Mypair._Myval2._Myend - _Mypair._Myval2._Myfirst</Item>
      <ArrayItems>
        <Size>_Mypair._Myval2._Mylast - _Mypair._Myval2._Myfirst</Size>
        <ValuePointer>_Mypair._Myval2._Myfirst</ValuePointer>
      </ArrayItems>
    </Expand>
  </Type>
</AutoVisualizer>

قبل enter image description here

بعد enter image description here

يعرض Visual Studio 2008، على الأقل بالنسبة لي، محتويات حاويات STL في مربع محتويات تمرير الماوس القياسي.

يمكنك أيضًا النقر بزر الماوس الأيمن فوق أي قيمة في ساعتك واختيار "إضافة ساعة".يمكن أن يكون هذا مفيدًا إذا كنت تحتاج فقط إلى النظر إلى عنصر واحد من الخريطة أو المجموعة.

كما أنه يؤدي أيضًا إلى الحل الذي نشره christopher_f للمتجهات - ((v)._Myfirst)[index]

الطريقة التي تمت مناقشتها أعلاه [((ت)._Myfirst)[الفهرس]] سيعمل فقط مع حاوية محددة (std::vector) وليس لجميع حاويات STL الممكنة.على سبيل المثال، إذا كنت تريد رؤية محتوى std::deque، فعليك البحث عن طريقة أخرى لتصفح المحتوى الموجود في std::deque.

ربما يمكنك تجربة الإعداد المماثل التالي لحل مشكلتك

[لقد اختبرت هذا الإعداد فقط لإصدار Visual Studio 2010 Professional المثبت مع حزمة الخدمة Microsoft Visual studio 2010 Service pack 1]

الخطوة 1:قم بإلغاء تثبيت حزمة الخدمة Microsoft Visual studio 2010 Service pack 1 - بالنسبة لعمل مشروعي، لا أحتاج حقًا إلى حزمة الخدمة 1، لذا فإن إلغاء تثبيت حزمة الخدمة 1 لن يسبب أي مشكلة في حالتي.

الخطوة 2:أعد تشغيل النظام الخاص بك.

الخطوه 3:هذه الخطوة ليست ضرورية إذا لم تحصل على الخطأ "LINK :خطأ فادح LNK1123:الفشل أثناء التحويل إلى COFF:الملف غير صالح أو تالف".خلاف ذلك من خلال تصفح

خاصية المشروع -> الرابط (عام) -> تغيير تمكين الارتباط المتزايد إلى لا (/INCREMENTAL:NO)

في مقابل عام 2015، لم أتمكن من تشغيل أي من هذه الأشياء
لذلك، كتبت قليلا من التعليمات البرمجية

1:كان لدي ناقلات ناقلات العناصر الطويلة الطويلة

std::vector<std::string> vs(M_coins + 1);
for (unsigned long long i = 0; i <= M_coins; i++) {
    std::for_each(memo[i].begin(), memo[i].end(), [i, &vs](long long &n) {
        vs[i].append(std::to_string(n));
        });
}
// now vs is ready for use as vs[0], vs[1].. so on, for your debugger

في الأساس ما فعلته هو تحويل المتجه إلى سلسلة.كان لدي متجه للمتجه لذلك كان لدي ناقل سلسلة لملءه.

2:إذا كان لديك فقط ناقلات العناصر الطويلة الطويلة, ، ثم قم بالتحويل كما يلي:

std::vector<std::string> s;
std::for_each(v1.begin(), v1.end(), [&s](long long &n) {
    s.append(std::to_string(n));
    });
// now s is ready for use, for your debugger

آمل أن يكون قد ساعد.

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