Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.92
Владимир 1
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 20
#1

Почему при создании динамического массива, отладчик видит только один первый элемент? - C++

01.10.2012, 11:33. Просмотров 2604. Ответов 21
Метки нет (Все метки)

Здравствуйте. Объясните почему при создании динамического массива, отладчик (а точнее окно "контрольные значения") видит только один первый элемент?
Извините за название темы. Модератор, прошу Вас исправить на "отладчик и динамический массив"
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2012, 11:33
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Почему при создании динамического массива, отладчик видит только один первый элемент? (C++):

Почему при создании динамического массива через new ячейки массива имеют значение -842150451? - C++
Я хотел бы узнать почему при создании динамического массива через операцию new ячейки массива имеют значение -842150451. #include...

Не получается удалить первый отрицательный элемент динамического массива - C++
Удалить первый отрицательный элемент динамического массива помогите пожалуйста #include "stdafx.h" #include <cstdlib> #include...

Поменять первый и максимальный элемент одномерного динамического массива - C++
Помогите пожалуйста, нужно разработать метод-член класса для преобразования одномерного динамического массива таким образом, чтобы его...

Ошибка при создании динамического массива. - C++
Все доброго времени. Начал создавать одномерный массив, потом решил его преобразовать в динамический одномерный. Понимаю что...

Ошибка при создании динамического двумерного массива - C++
Ткните пальцем, что не так. Только учусь, делаю лабы, камнями не забрасывайте. Смотрел шаблоны здесь и в других местах, но есть вопрос. ...

String subscript out of range при создании динамического массива - C++
Всем привет. Пишу игру на c++. Смысл состоит в том чтобы отстреливать группы врагов, которые появляются сразу после уничтожения предыдущей...

21
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
01.10.2012, 11:46 #2
Видимо, вы создаёте динамический массив как-то так:
C++
1
int * array = new int[Capacity];
array - это не массив, а указатель на первый элемент массива. Его и видит отладчик.
1
Владимир 1
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 20
01.10.2012, 13:18  [ТС] #3
Цитата Сообщение от John Prick Посмотреть сообщение
Видимо, вы создаёте динамический массив как-то так:
C++
1
int * array = new int[Capacity];
array - это не массив, а указатель на первый элемент массива. Его и видит отладчик.
А можно как-нибудь просмотреть сам динамический массив в отладчике?
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
01.10.2012, 14:43 #4
Ну чтобы автоматически массив раскрывался, то напрямую не получится (либо что-то хитроумное кодить, но не знаю, стоит ли оно того).
Если массив небольшой, то можно просто добавить в watch каждый элемент array[0], array[1] и т.д. Если большой - добавлять только интересущие элементы.
0
Владимир 1
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 20
01.10.2012, 20:48  [ТС] #5
Цитата Сообщение от John Prick Посмотреть сообщение
Ну чтобы автоматически массив раскрывался, то напрямую не получится (либо что-то хитроумное кодить, но не знаю, стоит ли оно того).
Если массив небольшой, то можно просто добавить в watch каждый элемент array[0], array[1] и т.д. Если большой - добавлять только интересущие элементы.
Спасибо. Хотя все равно непонятно, почему статические массивы можно просматривать по ссылке (имени), а динамические - нет.
0
Evg
Эксперт CАвтор FAQ
18915 / 6874 / 503
Регистрация: 30.03.2009
Сообщений: 19,354
Записей в блоге: 30
01.10.2012, 22:28 #6
Цитата Сообщение от Владимир 1 Посмотреть сообщение
А можно как-нибудь просмотреть сам динамический массив в отладчике?
Нельзя, потому как отладчик не знает, какого размера и чего ты там выделял. Для отладчика есть только переменная типа "указатель на int"

Добавлено через 1 минуту
Цитата Сообщение от Владимир 1 Посмотреть сообщение
Хотя все равно непонятно, почему статические массивы можно просматривать по ссылке (имени), а динамические - нет
Статический массив - это переменная типа "массив из стольки-то элементов". А динамический массив - это просто указатель. Вся отладочная информация, записываемая для отладчика - исключительно статическая
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
02.10.2012, 00:12 #7
Цитата Сообщение от Владимир 1 Посмотреть сообщение
Хотя все равно непонятно, почему статические массивы можно просматривать по ссылке (имени), а динамические - нет.
Хоть уже и ответили, добавлю и я. Когда массив задаётся статически, то его размер указывается явно в квадратных скобках. Вот эту цифирь в этих самых скобках отладчик может узнать, так как информация для отладчика формируется на этапе компиляции (тут я, может быть, не совсем прав, но для первого понимания достаточно). Когда же массив создаётся динамически, то на самом деле создаётся не массив, а вот что:
C++
1
int * array = new int[DynamicN];
Что здесь происходит? А по сути здесь происходит выделение памяти и создание DynamicN переменных типа int (где-то в "куче", лежащие подряд друг за другом) и адрес первой из этих переменных присваивается указателю array. Отладчик не покажет весь массив даже не потому, что не знает, чему будет равно DynamicN в момент создания, а потому, что для него нет того объекта, который он может показать (имеем в виду массив), а есть только именованый указатель array.
Вот такое объяснение перед сном Надеюсь, стало немного понятнее.
1
Evg
Эксперт CАвтор FAQ
18915 / 6874 / 503
Регистрация: 30.03.2009
Сообщений: 19,354
Записей в блоге: 30
02.10.2012, 00:15 #8
Цитата Сообщение от John Prick Посмотреть сообщение
так как информация для отладчика формируется на этапе компиляции (тут я, может быть, не совсем прав, но для первого понимания достаточно)
Абсолютно прав
2
Vourhey
Почетный модератор
6490 / 2264 / 123
Регистрация: 29.07.2006
Сообщений: 12,534
02.10.2012, 00:20 #9
Цитата Сообщение от Владимир 1 Посмотреть сообщение
А можно как-нибудь просмотреть сам динамический массив в отладчике?
В памяти можешь посмотреть.
Для int, как пример, можно посмотреть в памяти элементы по порядку в их десятичном виде:
Почему при создании динамического массива, отладчик видит только один первый элемент?
1
Владимир 1
0 / 0 / 0
Регистрация: 27.09.2012
Сообщений: 20
02.10.2012, 01:00  [ТС] #10
Спасибо всем за подробное объяснение.
Нехорошо, правда, получается: мы что-то где-то создаем, работаем с этим, а отследить не можем.
Ну а в памяти копаться - это уж если совсем плохо будет
0
monochromer
408 / 370 / 144
Регистрация: 03.01.2013
Сообщений: 964
03.12.2013, 19:04 #11
Посмотреть первые N значений массива можно, если в окне контролируемых значений написать x, N

Почему при создании динамического массива, отладчик видит только один первый элемент?
1
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.12.2013, 19:56 #12
Цитата Сообщение от monochromer Посмотреть сообщение
Посмотреть первые N значений массива можно, если в окне контролируемых значений написать x, N

Вложение 336611
И как это сделать? x - это что? Указатель?
0
monochromer
408 / 370 / 144
Регистрация: 03.01.2013
Сообщений: 964
03.12.2013, 20:40 #13
Цитата Сообщение от alsav22 Посмотреть сообщение
И как это сделать? x - это что? Указатель?
x был создан так:

double* x = new double[8];
0
alsav22
5437 / 4832 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.12.2013, 21:23 #14
Цитата Сообщение от monochromer Посмотреть сообщение
если в окне контролируемых значений написать x, N
Цитата Сообщение от alsav22 Посмотреть сообщение
И как это сделать?
Как такую запись сделать в окне контрольного значения?
0
monochromer
408 / 370 / 144
Регистрация: 03.01.2013
Сообщений: 964
04.12.2013, 08:19 #15
Щелкните 2 раза левой кнопкой мыши по названию переменной.
1
04.12.2013, 08:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2013, 08:19
Привет! Вот еще темы с ответами:

передача параметров в конструктор при создании динамического массива - C++
Добрый день! Есть довольно тривиальный класс: class Array1d{ int* ptr_; public: Array1d(int n): ptr_(new...

Ругается new при создании динамического массива через перегруженный конструктор - C++
Перегрузил конструктор: class Library { public: Library(void) //конструктор библиотеки без заданного типа { ...

Почему происходит инициализация только первого элемента динамического массива структуры? - C++
Здравствуйте. Я пишу программу для табулирования функции cos(x). Аргументы и значение функции нужно записать в массив структуры. Проблема в...

Выводит только первый элемент массива символов - C++
Потом вместо каждого символа выводит что-то вроде |for (int i = 0; i < 100; i++) { printf("%c\n", fault); }


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru