代码之家  ›  专栏  ›  技术社区  ›  Debajit

问:漂亮的打印一个二维数组?

  •  12
  • Debajit  · 技术社区  · 14 年前

    我有一个二维数组矩阵[10][10],我想在调试时检查它。

    我知道我可以在gdb中使用

    p *matrix@10
    

    但它只输出一行,这使得它很难阅读。

    有没有一种方法可以以任何方式格式化这个输出,比如说作为一个矩阵?

    4 回复  |  直到 7 年前
        1
  •  24
  •   vitaut    13 年前

    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;
    }
    

    使用-g开关编译此代码并在gdb下运行后,可以使用如下的print函数:

    (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 
    
        2
  •  10
  •   alesplin    14 年前

    你可以在gdb中定义一个函数来做同样的事情。如果您有以下C代码:

    #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) 
    

    您可以在gdb函数中轻松地使用嵌套while循环。而且,正如前面的回答中所指出的,您总是可以从gdb内部调用程序中的printArray函数。

        3
  •  4
  •   user1530392    11 年前

    这是最后一篇文章的一个更有用的扩展。 还可以使用:print var@cols@rows

    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
    
        4
  •  3
  •   XYZ    7 年前

    你能做到吗?:

    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中尝试过。看起来容易多了。