Как я могу ступить через вызовы вложенной функции в GDB?

Первая вещь я думаю о том, когда я считал этот вопрос: , какие типы вещей используют графики/деревья? и затем я думаю назад к тому, как я мог использовать их.

, Например, возьмите два общего использования дерева:

  • файловые системы DOM

DOM и XML в этом отношении, напоминают древовидные структуры.
alt text

Это имеет смысл, также. Это имеет смысл из-за того, как эти данные должны быть расположены . Файловая система, также. В системе UNIX существует корневой узел, и переходящий вниз ниже. При монтировании нового устройства Вы присоединяете его на дерево.

необходимо также спрашивать себя: данные попадают в этот тип структуры? Создайте структуры данных, которые имеют смысл к проблеме, и остальные будут следовать.

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

Думают о программе, которая решает загадку поиска слова. Вы могли планировать все буквы поиска слова в график и проверки окружающие узлы, чтобы видеть, распознает ли та строка какое-либо из слов. Но Вы не могли только сделать того же с с единым массивом? Все, что действительно необходимо сделать, переместить индекс для проверки букв налево и права, и шириной для проверки выше и ниже букв. Решение этой проблемы с графиком не является трудным, но это может создать большую дополнительную работу и трудность, если Вы не довольны использованием их - конечно, который не должен отговаривать Вас делать его, особенно если Вы узнаете о них.

я надеюсь, что это помогает Вам думать об этих структурах. Что касается книжной рекомендации, я должен был бы пойти с [1 115] Введение в Алгоритмы .

5
задан Peter Mortensen 16 April 2019 в 21:29
поделиться

2 ответа

Какую команду вы выполняете? next перейдет к следующей строке при отладке my_func1 (my_func2 (my_func3 (val))); , но шаг должен ввести my_func3. Пример:

int my_func1(int i)
{
  return i;
}

int my_func2(int i)
{
  return i;
}

int my_func3(int i)
{
  return i;
}

int main(void)
{
  return my_func1(my_func2(my_func3(1)));
}

Отлажено:

(gdb) b main
Breakpoint 1 at 0x4004a4: file c.c, line 19.
(gdb) run
Starting program: test

Breakpoint 1, main () at c.c:19
19    return my_func1(my_func2(my_func3(1)));
(gdb) step
my_func3 (i=1) at c.c:14
14    return i;
(gdb) step
15  }
(gdb) step
my_func2 (i=1) at c.c:9
9   return i;
(gdb) step
10  }
(gdb) step
my_func1 (i=1) at c.c:4
4   return i;
(gdb) step
5 }
(gdb) step
main () at c.c:20
20  }
(gdb) cont
Continuing.

Program exited with code 01.
(gdb)
8
ответ дан 14 December 2019 в 01:13
поделиться

Да, хотя вы могли испачкать руки при разборке. Сначала попробуйте команду step (сокращение s ). Если это не приводит вас к my_func3 () , попробуйте вместо этого команду stepi (сокращение si ) для выполнения одной инструкции за раз. Это может потребовать нескольких вызовов, поскольку может быть много инструкций, настраивающих аргументы вызова функции и выполняющих очистку после этого.

0
ответ дан 14 December 2019 в 01:13
поделиться
Другие вопросы по тегам:

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