Переменный дамп в C++

Один из способов состоит в том, чтобы напечатать оба числа, когда вы обнаружили, что они являются последовательными, но также проверить, что номер по индексу i-1 не был в последовательном списке, так что номер по индексу i не печатается дважды:

num = [8, 9, 4, 1, 2, 3]

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i] + 1 == num[i + 1]:
        if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
            print('Con', num[i])
        print('Con', num[i + 1])

Можно попробовать и с более сложным списком:

num = [8, 9, 4, 1, 2, 3, 4, 4, 8, 9, 1, 2, 3, 0, 1, 5, 6, 1]

for i in range(len(num)-1):  # not using -1 will cause index error
    if num[i] + 1 == num[i + 1]:
        if i == 0 or (i - 1 >= 0 and num[i - 1] != num[i] - 1):
            print('Con', num[i])
        print('Con', num[i + 1])
5
задан Quinn Taylor 15 June 2009 в 20:21
поделиться

6 ответов

Короткий ответ: нет, если вы сами не пишете такую ​​процедуру вручную.

Что часто не плохая идея, но обычно возникают проблемы с синхронизацией с классом, если вы часто добавляете / меняете участников. Это неизбежно, потому что в C ++ отсутствует какая-либо форма самоанализа в struct s.

Если вы решите пойти по этому пути, лучше всего написать перегрузку для std :: ostream & operator << (std :: ostream & os, MyClass const &) , что позволит печатать ваш класс в любом выходном потоке IOStreams.

8
ответ дан 18 December 2019 в 08:31
поделиться

Обычно отладчики достаточно умны, чтобы делать это.

В GDB вы можете использовать:

print structure

и в NTSD Вы можете сделать очень круто:

dt -r structure

Если вы просто используете это для целей отладки, я настоятельно рекомендую научиться использовать отладчики. Даже если вы хотите что-то зарегистрировать (например, печатать миллион раз), вы можете установить макрос точки останова.

В NTSD:

bp yourdll!yourobject::yourfunction "dt -r structure;g"

И я уверен, что есть способ сделать это и в GDB

4
ответ дан 18 December 2019 в 08:31
поделиться

В дополнение к другим ответам, в зависимости от того, для чего вы этого хотите и хотите ли вы переносимости, вы можете потенциально посмотрите на получение необходимой информации из отладочной информации, которую генерирует ваш компилятор. Вы можете анализировать файл формата COFF / ELF / независимо от формата из сборки, и это дает вам информацию, необходимую для определения имен и типов переменных в вашем объекте.

3
ответ дан 18 December 2019 в 08:31
поделиться

Обычно не возможно в C ++, поскольку требует использования отражения, которого нет в C ++. Конечно, вы можете написать свою собственную функцию для дампа определенных структур данных.

1
ответ дан 18 December 2019 в 08:31
поделиться

Если вы добавите отражение в C ++ (используя стороннюю библиотеку или расширения поставщика), вы можете написать подпрограмму для использовать эти данные отражения для сброса произвольных структур. Например, у меня есть некоторый код, который использует библиотеку CERN Reflex для перебора членов класса или структуры и выгрузки их в YAML .

3
ответ дан 18 December 2019 в 08:31
поделиться

Действительно, в среде, где у вас есть GDB, и вы компилируете свои источники с включенными отладочными символами (например, - ggdb) у вас может быть свой отладчик (например, gdb из командной строки или ddd, если вы хотите что-то графически).

Рассмотрим этот фрагмент кода:

#include <string>
#include <vector>

struct test
{
    int a;
    float b;
    std::string c;
};

int main()
{
    std::vector<int> v;

    test t;
    t.a=1;
    t.b=2.0;
    t.c="hello there";


    return 0;
}

При вежливом запросе gdb он может дать мне следующий вывод:

(gdb) break 20
Breakpoint 1 at 0x8048622: file bla.cpp, line 20.
(gdb) run
Starting program: /home/edb/a.out 

Breakpoint 1, main () at bla.cpp:21
21      return 0;
(gdb) print t
$1 = {a = 1, b = 2, c = {static npos = 4294967295, 
    _M_dataplus = {> = {> = {}, }, _M_p = 0x96b6014 "hello there"}}}
(gdb) ping v
Undefined command: "ping".  Try "help".
(gdb) print v
$2 = { >> = {
    _M_impl = {> = {> = {}, }, _M_start = 0x0, _M_finish = 0x0, 
      _M_end_of_storage = 0x0}}, }

Редактировать: обратите внимание, что эти данные доступны из контекста отладчика, для генерации этих дампов во время выполнения вам потребуется Предвидеть свою собственную функцию дампа / форматирования, обычно это делается путем перегрузки оператора << в C ++.

0
ответ дан 18 December 2019 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: