2017-02-20 17 views
3

У меня есть массив (называемый доской) указателей, которые указывают на массив. Я хочу напечатать его обычным способом (что довольно сложно в GDB).Печать int ** x в GDB

int col = 64, row = 2; 
int **board = new int*[col]; 
for(int i = 0; i < col; i++) 
    board[i] = new int[row]; 

я попытался следующие команды:

p *[email protected] (проблема печатается в шестнадцатеричные значения не как целое число)

x/100w array (она прокручивается так сильно вниз, что я не могу даже видеть значения)

*(T (*)[N])p (где p - массив, T - тип массива, а N - его размер) [Он просто не печатает точным]

+0

Вы должны предпочесть C++ [контейнеров] (http://en.cppreference.com/w/ CPP/контейнер). Вы запросите проблемы, кодируя этот путь. –

ответ

2

Я хочу напечатать его в обычном порядке

Лучше написать print_board процедуру, которую можно затем вызвать из GDB.

(что довольно сложно в GDB).

Это потому, что вы сделали это трудно.

Проблема заключается в том, что ваша доска, а не непрерывная в памяти (как это принято и будет тривиальной для печати в GDB), вместо этого распространена в 64 отдельных кусках по 2 значения каждый.

Поскольку вы используете C++, вы будете лучше использовать вектор векторов:

vector<vector<int>> board; 
board.resize(col); 
for (int i = 0; i < col; i++) { 
    board[i].resize(row); 
} 

(gdb) print board 
$1 = std::vector of length 64, capacity 64 = 
{std::vector of length 2, capacity 2 = {0, 0}, 
    std::vector of length 2, capacity 2 = {0, 0}, 
    ... 

P.S. При задании вопросов полезно показать актуальный код. Ваш вопрос имеет неправильный тип для board и смешивает board с array.

Update:

Как я могу это сделать (используйте print_board из GDB)?

Вот пример. Предположим, что ваш источник выглядит следующим образом:

1 #include <stdio.h> 
2 
3 int main() 
4 { 
5 int col = 16, row = 2; 
6 int **board = new int*[col]; 
7 
8 for (int i = 0; i < col; i++) { 
9  board[i] = new int[row]; 
10 } 
11 
12 // Initialize elements to something interesting, so we can see them 
13 // printed. 
14 for (int i = 0; i < col; i++) 
15  for (int j = 0; j < row; j++) 
16  board[i][j] = 100*i + j; 
17 
18 return 0; 
19 } 
20 
21 void print_board(int **board, int col, int row) 
22 { 
23 for (int j = 0; j < row; j++) { 
24  for (int i = 0; i < col; i++) { 
25  printf("\t%d", board[i][j]); 
26  } 
27  printf("\n"); 
28 } 
29 } 

Затем с помощью GDB:

gdb -q ./a.out 
(gdb) break 18 
(gdb) run 

Breakpoint 2, main() at t.cc:18 
18 return 0; 

(gdb) call print_board(board, col, row) 
    0 100 200 300 400 500 600 700 800 900 1000 1100 1200 1300 1400 1500 
    1 101 201 301 401 501 601 701 801 901 1001 1101 1201 1301 1401 1501 

вуаля

+0

Вектор векторов разделяет проблему, которую вы идентифицировали, не будучи непрерывной в памяти. –

+0

@ M.M Это правда, но векторный принт-принтер разрешает * эту проблему. –

+0

Собственно, этот ответ не помогает вообще. Я не сказал, как я могу напечатать «вектор векторов». Я попробовал print_board, и эта команда не найдена. – Siliproksi