2010-10-27 17 views
8

मेरे पास 2 डी सरणी मैट्रिक्स है [10] [10] कि मैं डीबग समय पर निरीक्षण करना चाहता हूं।जीडीबी प्रश्न: सुंदर 2 डी ऐरे प्रिंटिंग?

मैं समझता हूँ कि मैं

p *[email protected] 

का उपयोग कर GDB में ऐसा कर सकते हैं लेकिन यह एक पंक्ति में इस आउटपुट, उसे पढ़ने में कठिन बना रही है।

क्या इस आउटपुट को किसी भी रूप में स्वरूपित करने का कोई तरीका है, मैट्रिक्स के रूप में कहें?

+0

सी ++ या उद्देश्य सी या सी या क्या? –

+0

@ आर्मेन: उनमें से किसी एक में, मान लें कि मेरे पास एक सरणी int मैट्रिक्स है [10] [10]। – PlagueHammer

+1

'सेट प्रिंट सरणी' पर जीडीबी प्रिंट सुंदर बना देगा – yuan

उत्तर

20

GDB की एक महत्वपूर्ण विशेषता डिबग कोड में कार्यों को निष्पादित करने की क्षमता है, तो आप जो कुछ भी उदाहरण के लिए मुद्रण आप चाहें, तो लागू कर सकते हैं:

#include <stdio.h> 

int matrix[10][10]; 

void print(int matrix[10][10]) 
{ 
    int i, j; 
    for (i = 0; i < 10; ++i) 
    { 
     for (j = 0; j < 10; ++j) 
      printf("%d ", matrix[i][j]); 
     printf("\n"); 
    } 
} 

int main() 
{ 
    int i, j; 
    for (i = 0; i < 10; ++i) 
     for (j = 0; j < 10; ++j) 
      matrix[i][j] = i*10 + j; 
    return 0; 
} 

जी स्विच के साथ इस कोड संकलन और के तहत चलाने के बाद जीडीबी आप प्रिंट फ़ंक्शन का निम्नानुसार उपयोग कर सकते हैं:

(gdb) call print(matrix) 
0 1 2 3 4 5 6 7 8 9 
10 11 12 13 14 15 16 17 18 19 
20 21 22 23 24 25 26 27 28 29 
30 31 32 33 34 35 36 37 38 39 
40 41 42 43 44 45 46 47 48 49 
50 51 52 53 54 55 56 57 58 59 
60 61 62 63 64 65 66 67 68 69 
70 71 72 73 74 75 76 77 78 79 
80 81 82 83 84 85 86 87 88 89 
90 91 92 93 94 95 96 97 98 99 
+0

जानकारी के लिए धन्यवाद –

10

आप हमेशा एक ही काम करने के लिए जीडीबी में एक फ़ंक्शन को परिभाषित कर सकते हैं। आप निम्नलिखित ग कोड था:

#include <stdio.h> 
#define ARRAY_SIZE 5 

void printArray(int array[ARRAY_SIZE][ARRAY_SIZE]) { 
    int y; 

    for (y = 0; y < ARRAY_SIZE; y++) { 
    printf("[%d,%d,%d,%d,%d]\n", 
     array[y][0], 
     array[y][1], 
     array[y][2], 
     array[y][3], 
     array[y][4]); 
    } 
} 

int main(int argc, char *argv[]) { 
    int matrix[ARRAY_SIZE][ARRAY_SIZE] = { 
    {1,2,3,4,5}, 
    {5,1,2,3,4}, 
    {4,5,1,2,3}, 
    {3,4,5,1,2}, 
    {2,3,4,5,1}, 
    }; 

    printArray(matrix); 

    return 0; 
} 

फिर आप निम्न GDB समारोह (या इसे करने के लिए कुछ इसी तरह) निर्धारित कर सकते हैं:

(gdb) define printMatrix 
Type commands for definition of "printmatrix". 
End with a line saying just "end". 
>set $arr = $arg0 
>set $y = 0 
>while $y < 5 
>printf "[%d,%d,%d,%d,%d]\n",$arr[$y][0],$arr[$y][1],$arr[$y][2],$arr[$y][3],$arr[$y][4] 
>set $y = $y + 1 
>end 
>end 

जो निम्नलिखित उत्पादन में परिणाम होगा:

(gdb) printMatrix matrix 
[1,2,3,4,5] 
[5,1,2,3,4] 
[4,5,1,2,3] 
[3,4,5,1,2] 
[2,3,4,5,1] 
(gdb) 

आप अपने जीडीबी फ़ंक्शन में लूप के दौरान आसानी से नेस्टेड का उपयोग कर सकते हैं। और, जैसा कि पिछले उत्तर में बताया गया है, आप हमेशा अपने प्रोग्राम में प्रिंटएरे फ़ंक्शन को जीडीबी के भीतर से कॉल कर सकते हैं।

3

यह अंतिम पोस्ट का एक और अधिक उपयोगी विस्तार है। इसके अलावा, आप उपयोग कर सकते हैं: प्रिंट वर @ कॉलम @ पंक्तियों

define printMatrix 
set $arr = $arg0 
set $rows = $arg1 
set $cols = $arg2 
set $i = 0 
printf "\n" 
while $i < $rows 
set $j = 0 
while $j < $cols 
printf "%8.4f,",$arr[$i*$cols + $j] 
set $j = $j + 1 
end 
printf "\n" 
set $i = $i + 1 
end 
2

आप इस ?:

p *((double (*)[3][3])pointerToMatrix3x3) 

    (double [3][3]) $6 = { 
    [0] = ([0] = 1821.8790830216928, [1] = 0, [2] = 1622.4513098457062) 
    [1] = ([0] = 0, [1] = 1172.3930433142486, [2] = 1314.4812787191868) 
    [2] = ([0] = 0, [1] = 0, [2] = 1) 

p *((double (*)[4])pointerToVector4) 

    (double [3]) $7 = ([0] = 1821.8790830216928, [1] = 0, [2] = 1622.4513098457062) 

यह lldb में काम करता है कर सकते हैं - gdb में इसे करने की कोशिश नहीं की है। यह बहुत आसान लगता है।

संबंधित मुद्दे