LINUX.ORG.RU

Отображение массивов при дебаге

 ,


1

3

Есть динамический массив

struct
{
   double** m;
   int w, h;
} 

Нужно при дебаге отображать его содержимое.

Вводить вручную выражения вида x->m [ i ] [ j ] поднадоедает быстро. IDE - kdevelop 4.2

Можно ли сделать для него шаблон отображения подобных массивов, чтобы он мог отображать их наравне с массивами фиксированного размера?

★★★★★

Последнее исправление: cvs-255 (всего исправлений: 2)

Ответ на: комментарий от cvs-255

Ты вообще читал самый первый пост?

Да. Ты хочешь, чтобы дебаггер отобразил объявленный тобой указатель на указатель на double как массив. Что ещё необычного ты хочешь, школьник-затейник?

anonymous
()
Ответ на: комментарий от anonymous

Во-первых я не школьник уже

Во-вторых, я хочу именно то, чтобы дебаггер отобразил мне указатель на указатель на double как массив известного размера.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Во-первых я не школьник уже

Во-вторых, я хочу именно то, чтобы дебаггер отобразил мне указатель на указатель на double как массив известного размера.

Да, ты не школьник. Ты блондинко

anonymous
()
Ответ на: комментарий от anonymous

Ты невменяем?

Я вполне могу руками вбить 144 x->m[j] для всех i и j от 0 до 11, но мне влом.

Я спрашиваю, как объяснить дебагеру, чтобы он сделал это за меня

cvs-255 ★★★★★
() автор топика

Можно сделать по аналогии:

Reading symbols from /home/ioblakov/tmp/array...done.
(gdb) l 1
1	#include <stdio.h>
2	#define w 12
3	#define h 10
4	
5	static double d[w * h];
6	static double *dd[h];
7	
8	main()
9	{
10		int i, j;
(gdb) 
11		for (i = 0; i < h; i++) dd[i] = &d[w * i];
12		for (i = 0; i < h; i++)
13			for(j = 0; j < w; j++) dd[i][j] = i * 100 + j;
14		printf("dd[i-1][j-1] %g\n", dd[i-1][j-1]);
15		return 0;
16	}
17	
(gdb) b 14
Breakpoint 1 at 0x8048456: file array.c, line 14.
(gdb) run
Starting program: /home/ioblakov/tmp/array 

Breakpoint 1, main () at array.c:14
14		printf("dd[i-1][j-1] %g\n", dd[i-1][j-1]);
Missing separate debuginfos, use: debuginfo-install glibc-2.12.2-1.i686
(gdb) p (double [12])*dd[0]@10
$1 = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, {100, 101, 102, 103, 104, 105, 
    106, 107, 108, 109, 110, 111}, {200, 201, 202, 203, 204, 205, 206, 207, 
    208, 209, 210, 211}, {300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 
    310, 311}, {400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411}, {
    500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511}, {600, 601, 
    602, 603, 604, 605, 606, 607, 608, 609, 610, 611}, {700, 701, 702, 703, 
    704, 705, 706, 707, 708, 709, 710, 711}, {800, 801, 802, 803, 804, 805, 
    806, 807, 808, 809, 810, 811}, {900, 901, 902, 903, 904, 905, 906, 907, 
    908, 909, 910, 911}}
io ★★
()
Ответ на: комментарий от io

С другой стороны Kdevelop не пользовался. Он gdb-ные конструкции жрет?

io ★★
()
Ответ на: комментарий от io

Попробовал, но не сработало. Информация, которую он вывел, не совпадает с реальным содержимым.

Видимо, он при этом рассчитывал на какой-то конкретный вид хранения информации.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

На тот как у меня выше в программе, т.е. с промежуточным массивом ссылок, дабы [j] корректно разбиралось. А какой он на самом деле? Просто матрица w*h, т.е .адресация d[w*i + j] ? Тогда double *, а не **double. Каков пример для 3*2 размещения в памяти?

io ★★
()

А что, в Kdevelop нет аналога autoexp.dat из MSVС, чтобы сделать custom type visualization?

Вроде бы есть python-gdb, где можно на python писать визуализаторы для своих типов. Наверное, стоит в эту сторону смотреть.

kamre ★★★
()
Ответ на: комментарий от kamre

А что, в Kdevelop нет аналога autoexp.dat из MSVС, чтобы сделать custom type visualization?

Не слышал про аналог. Хотя возможно он есть.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Проблема в том что у меня все лежит подряд (можно было сделать в 2 new). Но раз оно разрывно, то нужен цикл.


(gdb) l
1	const int h = 7;
2	const int w = 5;
3	
4	int main() {
5		typedef double * pdouble;
6		double **d = new pdouble[h];
7		for (int i = 0; i < h; i++) {
8	   		d[i] = new double[w];
9	   		for (int j = 0; j < w; j++) d[i][j] = i*100 + j;
10		}
(gdb) 
11		return 0;
12	}
13	
14		
15	
(gdb) b 11
Breakpoint 1 at 0x804852b: file tmptmp.cc, line 11.
(gdb) r
...
(gdb) define outarray
Type commands for definition of "outarray".
End with a line saying just "end".
>set $index=0
>while $index < h
 >p (double [5])*d[$index]
 >set $index=$index+1
 >end
>end
(gdb) outarray
$13 = {0, 1, 2, 3, 4}
$14 = {100, 101, 102, 103, 104}
$15 = {200, 201, 202, 203, 204}
$16 = {300, 301, 302, 303, 304}
$17 = {400, 401, 402, 403, 404}
$18 = {500, 501, 502, 503, 504}
$19 = {600, 601, 602, 603, 604}
io ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.