วิธีการแสดงอาร์เรย์ที่จัดสรรแบบไดนามิกในดีบักเกอร์ Visual Studio


144

ถ้าคุณมีอาร์เรย์ที่ปันส่วนแบบคงที่ดีบัก Visual Studio สามารถแสดงองค์ประกอบอาร์เรย์ทั้งหมดได้อย่างง่ายดาย อย่างไรก็ตามหากคุณมีอาร์เรย์ที่จัดสรรแบบไดนามิกและชี้ไปที่ตัวชี้มันจะแสดงเฉพาะองค์ประกอบแรกของอาร์เรย์เมื่อคุณคลิก + เพื่อขยาย มีวิธีง่าย ๆ ในการบอกดีบักเกอร์แสดงข้อมูลนี้ให้ฉันเป็นอาร์เรย์ประเภท Foo และขนาด X หรือไม่

คำตอบ:


196

ใช่ง่าย บอกว่าคุณมี

char *a = new char[10];

เขียนในดีบักเกอร์:

a,10

จะแสดงเนื้อหาราวกับว่ามันเป็นอาร์เรย์


10
นั่นเป็นกลลวงที่ดี แต่ถ้าตัวชี้ของคุณชี้ไปยังอาร์เรย์ของโครงสร้างฉันพบว่าแต่ละองค์ประกอบขยายด้วย "a, 10" ในหน้าต่างดูตัวเองไม่สามารถขยายได้ หมายความว่าคุณไม่สามารถขุดเข้าไปในองค์ประกอบที่ 3 ของอาร์เรย์โดยใช้วิธีนี้ นั่นเป็นสิ่งที่สามารถเอาชนะได้หรือไม่?
SirPentor

@ SirPentor ฉันมีปัญหาเดียวกัน คุณพบวิธีแก้ปัญหาหรือไม่?
becko

@ becko - negatory มันน่าผิดหวัง
SirPentor

ว้าวมันไร้ประโยชน์สำหรับโครงสร้างคุณสามารถเห็นชื่อของ vars ไม่ใช่ค่า
Icebone1000

2
สำหรับผู้เริ่มต้น: หากคุณเลือกตัวแปร "a" คลิกขวาและเพิ่มเพื่อดูรายการ (ตรวจสอบ) หากคุณเปิดมุมมอง de debugger ในรายการค่าที่ดู (ฉันไม่สามารถหาชื่อของหน้าต่างได้ในขณะนี้) คุณ สามารถดับเบิลคลิก "a" และเปลี่ยนชื่อเป็น "a, X" โดยที่ X คือจำนวนรายการ ตอนนี้คุณจะเห็นคุณค่าทั้งหมด
darkgaze

33

มีสองวิธีในการดูข้อมูลในอาร์เรย์ m4x4:

float m4x4[16]={
    1.f,0.f,0.f,0.f,
    0.f,2.f,0.f,0.f,
    0.f,0.f,3.f,0.f,
    0.f,0.f,0.f,4.f
};

วิธีหนึ่งคือด้วยหน้าต่างดู (Debug / Windows / Watch) เพิ่มการเฝ้าดู =

m4x4,16

สิ่งนี้แสดงข้อมูลในรายการ:

ป้อนคำอธิบายรูปภาพที่นี่

อีกวิธีคือใช้หน้าต่างหน่วยความจำ (Debug / Windows / Memory) ระบุที่อยู่เริ่มต้นหน่วยความจำ =

m4x4

สิ่งนี้แสดงข้อมูลในตารางซึ่งดีกว่าสำหรับเมทริกซ์สองและสามมิติ:

ป้อนคำอธิบายรูปภาพที่นี่

คลิกขวาที่หน้าต่างหน่วยความจำเพื่อกำหนดวิธีการแสดงข้อมูลไบนารี ตัวเลือกถูก จำกัด ไว้ที่จำนวนเต็มลอยและการเข้ารหัสข้อความบางส่วน


21

ในหน้าต่างการเฝ้าดูเพิ่มเครื่องหมายจุลภาคหลังชื่อของอาร์เรย์และจำนวนรายการที่คุณต้องการให้แสดง


10

การเยี่ยมชม:

สมมติว่าคุณมีตัวชี้ด้านล่าง:

double ** a; // assume 5*10

จากนั้นคุณสามารถเขียนด้านล่างใน Visual Studio debug Watch:

(double(*)[10]) a[0],5

ซึ่งจะโยนลงในอาร์เรย์เหมือนด้านล่างและคุณสามารถดูเนื้อหาทั้งหมดได้ในครั้งเดียว

double[5][10] a;

5

สำหรับ,

int **a; //row x col

เพิ่มสิ่งนี้เพื่อดู

(int(**)[col])a,row

ได้โปรดบอกฉันฉันหา "ดู" ไม่พบ มันอยู่ที่ไหน?
Egor สุ่ม

4

แต่วิธีการที่จะทำเช่นนี้อีกที่ระบุไว้ที่นี่ในMSDN

ในระยะสั้นคุณสามารถแสดงอาร์เรย์อักขระเป็นสตริงหลายประเภท หากคุณมีอาร์เรย์ที่ประกาศเป็น:

char *a = new char[10];

คุณสามารถพิมพ์เป็นสตริง unicode ในหน้าต่างการเฝ้าดูด้วยสิ่งต่อไปนี้:

a,su

ดูตารางในหน้า MSDN สำหรับการแปลงทั้งหมดที่เป็นไปได้เนื่องจากมีจำนวนไม่มากนัก ชุดตัวเลือกสตริงที่แตกต่างกันชุดตัวเลือกที่จะพิมพ์แต่ละรายการในอาเรย์


1
จากลิงก์ MSDN ที่คุณให้ - a,[10]ช่วยให้คุณเห็นองค์ประกอบแต่ละตัวเพื่อให้สามารถขยายได้แม้ว่าคุณจะมี CArray ประเภทข้อมูลที่ซับซ้อน
LThode

1

สำหรับอาร์เรย์ MFC (CArray, CStringArray, ... ) ตามลิงค์ถัดไปใน Tip # 4

http://www.codeproject.com/Articles/469416/10-More-Visual-Studio-Debugging-Tips-for-Native-De

ตัวอย่างเช่น "CArray pArray" ให้เพิ่มในหน้าต่าง Watch

     pArray.m_pData,5 

เพื่อดูองค์ประกอบ 5 ประการแรก

หาก pArray เป็น CArray สองมิติคุณสามารถดูองค์ประกอบใด ๆ ของมิติที่สองโดยใช้ไวยากรณ์ถัดไป:

     pArray.m_pData[x].m_pData,y

1

คุณสามารถค้นหารายการสิ่งต่างๆมากมายที่คุณสามารถทำได้กับตัวแปรในหน้าต่างการเฝ้าดูในอัญมณีนี้ในเอกสาร: https://msdn.microsoft.com/en-us/library/75w45ekt.aspx

สำหรับตัวแปร a มีสิ่งที่กล่าวถึงแล้วในคำตอบอื่น ๆ เช่น

a,10 
a,su 

แต่มี specifiers อื่น ๆ มากมายสำหรับรูปแบบและขนาดเช่น:

a,en (shows an enum value by name instead of the number)
a,mb (to show 1 line of 'memory' view right there in the watch window)

0

ฉันไม่พบวิธีใช้สิ่งนี้กับอาร์เรย์หลายมิติ แต่อย่างน้อยคุณสามารถ (ถ้าคุณรู้ว่าดัชนีของรายการที่คุณต้องการ) เพิ่มนาฬิกาเป็นค่าเฉพาะ เพียงใช้ตัวดำเนินการดัชนี

สำหรับ Array ที่ชื่อว่า current ซึ่งมี Array ชื่อ Attribs อยู่ภายในซึ่งมี Array ชื่อว่า Attrib อยู่ภายในมันควรจะมีหน้าตาแบบนี้ถ้าคุณต้องการให้มีตำแหน่ง 26:

((*((*current).Attribs)).Attrib)[26]

คุณยังสามารถใช้ออฟเซ็ต

((*((*current).Attribs)).Attrib)+25

จะแสดงองค์ประกอบ "ถัดไป" 25 รายการ (ฉันใช้ VS2008 นี่แสดงได้สูงสุด 25 องค์ประกอบเท่านั้น)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.