Работа с классами: выбрасывается исключение на push - Free Pascal
Формулировка задачи:
Доброго времени суток.
То ли глаз замылился и я не вижу простую ошибку, то ли я не понимаю, как устроены классы, что вероятнее.
Выбрасывается исключение на push. В момент создания узла node. Причем видимо оба конструктора в TItem мертвы, т.к. исключение генерируется одно и тоже (с поправкой на ветер). Т.е. судя по всему узел не размещается в памяти, а вызов к-ра TObject не спасает.
И простенький мейн, чтобы проверить
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils; type TItem = class private data : integer; next : TItem; public constructor Create(data_ : integer); constructor Create(data_ : integer; const next_ : TItem); end; type TStack = class private top : TItem; public constructor Create; function empty: boolean; function push(data : integer): boolean; function pop(var data : integer): boolean; function pop: boolean; function pick(var data : integer): boolean; destructor Done; end; implementation constructor TItem.Create(data_ : integer); begin // inherited Create; data := data_; next := nil; end; constructor TItem.Create(data_ : integer; const next_: TItem); begin // inherited Create; data := data_; next := next_; end; constructor TStack.Create; begin top := nil; end; function TStack.empty: boolean; begin exit(top = nil); end; function TStack.push(data : integer): boolean; var node : TItem; begin // node.Create(data, top); node.Create(data); node.next := top; if node = nil then exit(false); top := node; exit(true); end; function TStack.pop(var data : integer): boolean; var temp : TItem; begin if empty then exit(false); data := top.data; temp := top; top := top.next; temp.Destroy; exit(true); end; function TStack.pop: boolean; var temp : TItem; begin if empty then exit(false); temp := top; top := top.next; temp.Destroy; exit(true); end; function TStack.pick(var data : integer): boolean; begin if empty then exit(false); data := top.data; exit(true); end; destructor TStack.Done; begin while pop do; end; end.
program project1; uses unit1; var store : TStack; i, num : integer; begin store.Create; for i := 0 to 10 do begin if not store.push(i) then break; store.pick(num); write(num:5); end; writeln; while not store.empty do store.pop; writeln(store.pick(num)); readln; store.Free; end.
P.S. Извиняюсь за пунктуацию в заголовке
Решение задачи: «Работа с классами: выбрасывается исключение на push»
textual
Листинг программы
unit u1; interface type TObj1 = class class constructor Create; class destructor Destroy; end; implementation class constructor TObj1.Create; begin WriteLn('TObj1.Create'); end; class destructor TObj1.Destroy; begin WriteLn('TObj1.Destroy'); end; initialization WriteLn('u1 initialization'); finalization WriteLn('u1 finalization'); end.
Объяснение кода листинга программы
- Объявлен тип TObj1, представляющий класс.
- В классе TObj1 объявлены два метода:
- class constructor TObj1.Create;
- class destructor TObj1.Destroy;
- Реализован метод class constructor TObj1.Create;
- Реализован метод class destructor TObj1.Destroy;
- В разделе initialization вызван метод TObj1.Create;
- В разделе finalization вызван метод TObj1.Destroy;
- Заголовок модуля: unit u1;
- В интерфейсе объявлен тип TObj1;
- В реализации объявлены методы TObj1.Create; и TObj1.Destroy;
- В методе TObj1.Create; выведен текст
TObj1.Create
; - В методе TObj1.Destroy; выведен текст
TObj1.Destroy
; - В разделе initialization выведен текст
u1 initialization
; - В разделе finalization выведен текст
u1 finalization
; - Итог: код представляет собой простую программу, которая выводит на консоль информацию о создании и уничтожении объектов класса TObj1.
- Исключение на push не выбрасывается, так как в коде нет операции push.
- Код не содержит ошибок, но и не решает никакой конкретной задачи, кроме вывода информации на консоль.
- В реальной программе для работы с классами в Pascal обычно используются более сложные операции, такие как создание и использование объектов, наследование, полиморфизм и т.д.
- Этот код можно использовать как отправную точку для изучения работы с классами в Pascal.
- Для полноценной работы с классами в Pascal необходимо изучить и использовать другие элементы языка, такие как свойства, методы, наследование и т.д.
- Этот код не решает конкретной задачи, но демонстрирует базовые принципы работы с классами в Pascal.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д