2016-08-03 123 views
-2

我想在Visual Studio中調試多維C++數組。如何在調試時在VS中觀察C++數組的切片?

在英特爾Fortran中(集成在VS中),假定arr是2維數組,我可以使用「arr(2:5,3:8)」來查看數組的切片。

enter image description here

英特爾Fortran可以在VS2010做到這一點。如果我在C++中編寫自己定義的類(如CMultiDimensionArray),如何實現相同的目標?

+0

如果你切換到std :: vector,VS會整齊地顯示它 –

回答

1

您可以爲您的類創建自定義本機可視化工具(.natvis),以便根據需要呈現對象。請參閱Creating Custom Views of Native Objects。甚至有一個關於該鏈接頁面上多維數組的自定義視圖的例子。

+0

但是natvis似乎不能接受參數。這是我可以使用natvis自定義顯示「ii」,但我無法顯示「ii(2:3,4:5)」。 我不熟悉納塔維斯,是不是? – EruditePig

0

不,沒有辦法將參數傳遞給natvis表示。我一直在提倡這一點,但是沒有人聽,或者這對他們來說太複雜了。但是,您可以創建靜態的並在調試時進行修改,或者可以基於使用ExcludeView/IncludeView的原始類型創建psudo類型副本,並使用view()修飾符來創建具有相同類型的多個視圖。

實施例類型:

struct myarray 
{ 
    int x[10][10]; 
}; 

例默認視圖:

<Type Name="myarray" IncludeView="x"> 
    <Expand> 
    <CustomListItems> 
     <!-- Parameters --> 
     <Variable Name="x_begin" InitialValue="2"/> 
     <Variable Name="x_end" InitialValue="5"/> 
     <Variable Name="y_begin" InitialValue="3"/> 
     <Variable Name="y_end" InitialValue="8"/> 

     <!-- Local variables --> 
     <Variable Name="x_index" InitialValue="x_begin"/> 
     <Variable Name="y_index" InitialValue="y_begin"/> 
     <Loop Condition="y_index &lt;= y_end"> 
     <Exec>x_index=x_begin</Exec> 
     <Loop Condition="x_index &lt;= x_end"> 
      <Item Name="[{x_index}, {y_index}]">x[x_index][y_index]</Item> 
      <Exec>++x_index</Exec> 
     </Loop> 
     <Exec>++y_index</Exec> 
     </Loop> 
    </CustomListItems> 
    </Expand> 
</Type> 

<Type Name="myarray"> 
    <Expand> 
    <CustomListItems> 
     <!-- Parameters --> 
     <Variable Name="x_begin" InitialValue="0"/> 
     <Variable Name="x_end" InitialValue="10"/> 
     <Variable Name="y_begin" InitialValue="0"/> 
     <Variable Name="y_end" InitialValue="10"/> 

     <!-- Local variables --> 
     <Variable Name="x_index" InitialValue="x_begin"/> 
     <Variable Name="y_index" InitialValue="y_begin"/> 
     <Loop Condition="y_index &lt;= y_end"> 
     <Exec>x_index=x_begin</Exec> 
     <Loop Condition="x_index &lt;= x_end"> 
      <Item Name="[{x_index}, {y_index}]">x[x_index][y_index]</Item> 
      <Exec>++x_index</Exec> 
     </Loop> 
     <Exec>++y_index</Exec> 
     </Loop> 
    </CustomListItems> 
    </Expand> 
</Type> 

例使用率在監視窗口(假定命名類型x的array變量存在):

  1. 顯示默認:

    陣列

  2. 顯示自定義的:

    陣列中的視圖(X)

注意視圖名稱是區分大小寫的,但不喜歡任何非字母數字字符。只要它看到一個,它就認爲natvis文件中名稱的結尾,如果使用視圖名稱,則不匹配。

I.e.名字是「hello there」,view(hello)會匹配,但view(hello there)不會。因此,不要在你的名字中使用下劃線或標點符號。