Подтвердить что ты не робот

Отладка кода на С++ с использованием: vector, string, STL

Я начинаю С++. Когда я пытаюсь отлаживать код С++, используя следующие конструкции, такие как строка, вектор некоторых родных типов, STL и т.д., Отладка становится утомительной. Я использую MS Visual Studio 2010/Visual С++ 2010 Express.

например.

- При использовании строки, как показано ниже:

string str;

getline(cin, str);

for(i=0; i<str.size();i++)

В окне просмотра не отображаются значения для str [i]. Он говорит, что перегруженный оператор не найден. Мне нужно вручную свернуть всю строчную переменную str и увидеть элемент char в этом конкретном индексе, который становится громоздким.

- При использовании вектора, как показано ниже, та же проблема. Если я установил переменную v1 [k] в окне просмотра той же самой ошибки.

vector<int> v1(100);


for(int k=0;k<100;k++)
{
    v1.push_back(k);
}

- Пробовал использовать простые итераторы STL, такие как it.begin(), it.end() и алгоритмы вроде sort(), reverse(), я не мог отлаживать внутри этих функций путем шага или не мог установить точку останова в (я знаю, что они находятся в STL или в какой-то такой стандартной библиотеке, они были бы уверены в отсутствии ошибок, но их можно использовать неправильно, передав что-то недействительное/неправильное)

Исходя из использования языка C на многие годы, на С++, я нахожу это отсутствие "способности отладки" или некоторых ограничений в этом, болезненным, в то время как я пытаюсь понять большие куски кода на С++, написанные кем-то еще, Работа.

Мои вопросы -

Каковы эффективные способы отладки рабочего кода для понимания его функциональности при использовании идиом, таких как шаг, точки останова, точки наблюдения, окна просмотра. Является ли какой-либо конкретный отладчик лучше/хуже других (например, лучше gdb) или есть какие-либо специальные трюки/советы, которые помогут отлаживать.

В общем, как анализировать код на С++, чтобы понять его работу?

4b9b3361

Ответ 1

Как вы выяснили, попытка использования перегруженных операторов в окне просмотра просто не работает. Вам нужно разбить объекты и вытащить переменные-члены.

В MSVC std::vector имеет переменную-член _Myfirst, которая указывает на первый элемент своего буфера. Чтобы получить элемент в индексе i, вы можете добавить

(v._Myfirst)[i]

В окне просмотра. Вы также можете использовать

(v._Myfirst),10

Чтобы показать первые 10 элементов массива.

Для std::string должна существовать аналогичная переменная-член.

Ответ 2

У очень небольшого количества типов есть "отладочные визуализаторы", указанные для них, чтобы помочь в отладке. В общем, это фантастическая помощь, и теперь мне почти невозможно что-либо сделать без них (почему меня волнует реализация вектора... Я просто хочу знать, что в нем!)

Если, однако, вы хотите отключить их, google для файла "autoexp.dat", который контролирует это. Вы можете просто удалить несколько строк, и все вернется к плоским типам. Я предупреждаю вас, что такие вещи, как карты и наборы, становятся практически без отладки без визуализаторов.

Альтернативно, переключитесь на С++/CLI. VS2010 не поддерживает отладочные визуализаторы в С++/CLI, что обычно является огромным разочарованием, но я думаю, это может быть то, что вы ищете.

Ответ 3

В Инструменты > Параметры.. > Отладкa > Общие снимите следующие пункты:

  • Показывать исходную структуру объектов в переменных windows
  • Использовать режим основной совместимости

Затем вы увидите отформатированный вывод.