Работа с классами: выбрасывается исключение на push - Free Pascal

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. То ли глаз замылился и я не вижу простую ошибку, то ли я не понимаю, как устроены классы, что вероятнее. Выбрасывается исключение на push. В момент создания узла node. Причем видимо оба конструктора в TItem мертвы, т.к. исключение генерируется одно и тоже (с поправкой на ветер). Т.е. судя по всему узел не размещается в памяти, а вызов к-ра TObject не спасает.
Листинг программы
  1. unit Unit1;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils;
  6. type TItem = class
  7. private
  8. data : integer;
  9. next : TItem;
  10. public
  11. constructor Create(data_ : integer);
  12. constructor Create(data_ : integer; const next_ : TItem);
  13. end;
  14. type
  15. TStack = class
  16. private
  17. top : TItem;
  18. public
  19. constructor Create;
  20. function empty: boolean;
  21. function push(data : integer): boolean;
  22. function pop(var data : integer): boolean;
  23. function pop: boolean;
  24. function pick(var data : integer): boolean;
  25. destructor Done;
  26. end;
  27. implementation
  28. constructor TItem.Create(data_ : integer);
  29. begin
  30. // inherited Create;
  31. data := data_;
  32. next := nil;
  33. end;
  34. constructor TItem.Create(data_ : integer; const next_: TItem);
  35. begin
  36. // inherited Create;
  37. data := data_;
  38. next := next_;
  39. end;
  40. constructor TStack.Create;
  41. begin
  42. top := nil;
  43. end;
  44. function TStack.empty: boolean;
  45. begin
  46. exit(top = nil);
  47. end;
  48. function TStack.push(data : integer): boolean;
  49. var node : TItem;
  50. begin
  51. // node.Create(data, top);
  52. node.Create(data);
  53. node.next := top;
  54. if node = nil then exit(false);
  55. top := node;
  56. exit(true);
  57. end;
  58. function TStack.pop(var data : integer): boolean;
  59. var temp : TItem;
  60. begin
  61. if empty then exit(false);
  62. data := top.data;
  63. temp := top;
  64. top := top.next;
  65. temp.Destroy;
  66. exit(true);
  67. end;
  68. function TStack.pop: boolean;
  69. var temp : TItem;
  70. begin
  71. if empty then exit(false);
  72. temp := top;
  73. top := top.next;
  74. temp.Destroy;
  75. exit(true);
  76. end;
  77. function TStack.pick(var data : integer): boolean;
  78. begin
  79. if empty then exit(false);
  80. data := top.data;
  81. exit(true);
  82. end;
  83. destructor TStack.Done;
  84. begin
  85. while pop do;
  86. end;
  87. end.
И простенький мейн, чтобы проверить
Листинг программы
  1. program project1;
  2. uses unit1;
  3. var store : TStack;
  4. i, num : integer;
  5. begin
  6. store.Create;
  7. for i := 0 to 10 do
  8. begin
  9. if not store.push(i) then break;
  10. store.pick(num);
  11. write(num:5);
  12. end;
  13. writeln;
  14. while not store.empty do
  15. store.pop;
  16. writeln(store.pick(num));
  17. readln;
  18. store.Free;
  19. end.
P.S. Извиняюсь за пунктуацию в заголовке

Решение задачи: «Работа с классами: выбрасывается исключение на push»

textual
Листинг программы
  1. unit u1;
  2. interface
  3. type
  4.   TObj1 = class
  5.     class constructor Create;
  6.     class destructor  Destroy;
  7.   end;
  8. implementation
  9. class constructor TObj1.Create;
  10. begin
  11.   WriteLn('TObj1.Create');
  12. end;
  13. class destructor  TObj1.Destroy;
  14. begin
  15.   WriteLn('TObj1.Destroy');
  16. end;
  17. initialization
  18.   WriteLn('u1 initialization');
  19. finalization
  20.   WriteLn('u1 finalization');
  21. end.

Объяснение кода листинга программы

  1. Объявлен тип TObj1, представляющий класс.
  2. В классе TObj1 объявлены два метода:
    • class constructor TObj1.Create;
    • class destructor TObj1.Destroy;
  3. Реализован метод class constructor TObj1.Create;
  4. Реализован метод class destructor TObj1.Destroy;
  5. В разделе initialization вызван метод TObj1.Create;
  6. В разделе finalization вызван метод TObj1.Destroy;
  7. Заголовок модуля: unit u1;
  8. В интерфейсе объявлен тип TObj1;
  9. В реализации объявлены методы TObj1.Create; и TObj1.Destroy;
  10. В методе TObj1.Create; выведен текст TObj1.Create;
  11. В методе TObj1.Destroy; выведен текст TObj1.Destroy;
  12. В разделе initialization выведен текст u1 initialization;
  13. В разделе finalization выведен текст u1 finalization;
  14. Итог: код представляет собой простую программу, которая выводит на консоль информацию о создании и уничтожении объектов класса TObj1.
  15. Исключение на push не выбрасывается, так как в коде нет операции push.
  16. Код не содержит ошибок, но и не решает никакой конкретной задачи, кроме вывода информации на консоль.
  17. В реальной программе для работы с классами в Pascal обычно используются более сложные операции, такие как создание и использование объектов, наследование, полиморфизм и т.д.
  18. Этот код можно использовать как отправную точку для изучения работы с классами в Pascal.
  19. Для полноценной работы с классами в Pascal необходимо изучить и использовать другие элементы языка, такие как свойства, методы, наследование и т.д.
  20. Этот код не решает конкретной задачи, но демонстрирует базовые принципы работы с классами в Pascal.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.2 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы