Работа с классами: выбрасывается исключение на 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.

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

  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
Похожие ответы