Как представить INT * в виде массива в Totalview? - PullRequest
3 голосов
/ 21 января 2010

Как мне «нырнуть» int *, который указывает на динамически размещенный массив целых чисел и представляет его как фиксированный массив int []? Иначе говоря, если я погружаю int *, он показывает адрес и целое число, на которое указывает указатель, но вместо этого я хотел бы видеть массив всех целых чисел.

Ответы [ 4 ]

8 голосов
/ 22 января 2010

Я заметил тег TotalView по этому вопросу. Вы спрашиваете, как увидеть значения в вашем массиве в totalview? Если так, то ответ довольно прост.

Допустим, у вас есть указатель p типа int *, и он в данный момент указывает на массив с 10 целыми числами.

Шаг 1. Погружение по указателю. Это можно сделать, дважды щелкнув, щелкнув среднюю кнопку мыши или используя параметр погружения в контекстном меню - и все это после наведения курсора мыши на переменную в области исходного кода или панели стека.

Откроется новое окно с надписью

Выражение: p Адрес: 0xbfaa1234 Тип: int *

и вниз в области данных скажет что-то вроде

0x08059199 -> 0x000001a5 (412)

Это окно показывает вам сам указатель, указанный адрес является адресом указателя. Значение (0x08059199 в примере выше) является фактическим значением, которое имеет указатель. Все, что находится справа от стрелки, является просто «подсказкой», указывающей на то, на что она указывает.

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

Это эффективно разыменует указатель. Теперь окно ориентировано не на сам указатель, а на то, на что указывает указатель. Обратите внимание, что адресное поле теперь содержит 0x08059199, которое было значением ранее.

выражение: * (((int *) p)) Адрес: 0x08059199 Тип: int

и внизу в области данных он скажет что-то вроде

0x000001a5 (412)

Шаг 3. Приведите окно данных к нужному типу. Просто щелкните в поле типа и измените его на int [10]. Затем нажмите «вернуться».

Это говорит отладчику, что 0x08059199 - это начало массива из 10 целых чисел.

В окне вырастут два новых поля: Slice и Filter. Вы можете оставить их в покое, но они могут пригодиться позже.

В области данных теперь будут отображаться два столбца «поле» и «значение» и 10 строк.

Столбец поля будет индексом в массиве [0] - [9], а столбец значения скажет вам, какие данные у вас есть в каждом местоположении массива.

Другие советы:

  • В более сложных структурах данных вы можете захотеть погрузиться в отдельные элементы (которые также могут быть указателями, дайвинг также разыменует их)

  • Вы всегда можете привести к разным типам или длинам, чтобы смотреть на данные "как если бы они были" какими бы то ни было

  • Вы можете редактировать фактические значения данных, щелкая столбец значений и редактируя то, что вы там найдете. Это полезно, если вы хотите спровоцировать конкретное неправильное поведение в вашем приложении

  • Операции погружения всегда можно отменить с помощью значка «<» в верхнем правом углу окна переменной. </p>

Есть несколько онлайн-видео, которые могут оказаться полезными на

http://www.roguewave.com/products/totalview/resources/videos.aspx

в частности, есть один с пометкой «Начало работы с TotalView».

Не стесняйтесь обращаться к нам в Rogue Wave Software за советами по использованию TotalView! поддержка в roguewave dot com - хороший адрес для этого.

Крис Готбрат (Крис Дот Готбрат в roguewave dot com) Менеджер по продукту TotalView в Rogue Wave Software

0 голосов
/ 21 января 2010

Вы не можете сделать это осмысленно, не зная точно, сколько целых чисел в массиве.

0 голосов
/ 21 января 2010

Если у вас есть int *p, который указывает на первый элемент в непрерывных int данных, либо динамически размещаемых, либо в статическом массиве, вы можете проиндексировать его, как если бы это был массив:

int *data = malloc(3 * sizeof *data);
int *p;
/* malloc error detection omitted for brevity */
data[0] = 1;
data[1] = 2;
data[3] = 42;

p = data;
assert(p[0] == 1);
assert(p[1] == 2);
assert(p[2] == 42);

Вы должны знать размер действительных данных, к которым вы обращаетесь таким образом.

Итак, допустим, у меня есть data, как указано выше, и я хочу написать функцию для его печати. Не нужно объявлять функцию так:

void print_array(int *data);

потому что когда вы вызываете print_array(data);, функция не знает количество элементов для печати. ​​

Вы можете определить свой print_array() как:

void print_array(int *data, size_t n);

, где n обозначает количество допустимых элементов, на которые указывает data, которые должен предоставить вызывающий объект. Или вы можете решить, что каждый «массив» будет заканчиваться значением часового, которое используется только в конце данных и не является полезным значением в противном случае:

data[2] = 0; /* data[0] and data[1] are useful, valid values
                and data[2] is 0 to signify the end of the data */

Тогда вы можете объявить свой print_array() как:

void print_array(int *data);

и продолжайте индексировать в data в определении функции, пока не дойдете до стража:

void print_array(int *data)
{
    size_t i;
    for (i=0; data[i] != 0; ++i)
        printf("%d\n", data[i]);
}

Итак, чтобы ответить на ваш вопрос, вы уже можете обрабатывать указатель на действительные динамически распределяемые данные как массив. Конечно, вы должны помнить размер выделенных данных, что вам также нужно делать в обычном массиве.

0 голосов
/ 21 января 2010

Это не очень сложно, но я забыл, как именно это работает. Я нашел вам страницу, которая объясняет это;). Я думаю, что для указания и массива с целыми числами, вызываемыми, например, test, вы должны получить его, используя & test. Просто проверьте эту страницу:

http://www.cplusplus.com/doc/tutorial/pointers/

...