Работа с классами: выбрасывается исключение на 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д