Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2012, 04:02   #1
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию Class stack

Доброго времени суток Уважаемые делфи разработчики.
Прошу помощи в реализации стека, т.к. с делфями никогда не приходилось раньше работать, вот сейчас такая необходимость возникла.
Написал кое-что, но он категорически отказывается работать.
Вот модуль, реализующий методы работы стека:
Код:
unit StStack;

interface

uses
  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TStStack = class
  private
    FItems: array of string;
  public
    procedure Push( newObject: string );
    function Pop(): string;
    function Peek(): string;
    procedure Clear();

    function GetCount(): integer;
    property Count: integer read GetCount;

    destructor Destroy;
  end;

implementation

procedure TStStack.Push( newObject: string );
var
  newCount: integer;
begin
  newCount := Count + 1;
  SetLength( FItems, newCount );
  FItems[ newCount - 1 ] := newObject;
end;

function TStStack.Pop(): string;
begin
  if Count = 0 then
    raise Exception.Create('Стек пуст');

  SetLength( FItems, Count - 1 );
  Result:= FItems[ Count - 1 ];
end;

function TStStack.Peek(): string;
begin
  if Count = 0 then
    raise Exception.Create('Стек пуст');

    Result := FItems[ Count - 1 ]
end;

function TStStack.GetCount(): integer;
begin
  Result := Length( FItems );
end;

procedure TStStack.Clear();
var
  i: integer;
begin
  SetLength( FItems, 0 );
end;

destructor TStStack.Destroy;
begin
  Clear();
  inherited Destroy;
end;

end.
Вот код, который по клику на кнопку должен добавлять элемент в стек, и извлекать его в поле TListBox:
Код:
unit MainUnit;

interface

uses
  Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, StStack, Contnrs;

type
  TBracket = class

  end;


  TMainForm = class(TForm)
    BracketEdit: TEdit;
    CheckButton: TButton;
    ErrorList: TListBox;
    procedure CheckButtonClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    Stack: TStack;
  public

  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMainForm.FormCreate(Sender: TObject);
begin
  Stack := TStack.Create;
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  Stack.Free;
end;

procedure TMainForm.CheckButtonClick(Sender: TObject);
begin
  Stack.Push( BracketEdit.Text );
  ErrorList.Items.Add( Stack.Pop )
end;

end.
Компилятор ругается на вот эту строку:
Stack.Push( BracketEdit.Text );
mainunit.pas(47,32) Error: Incompatible type for arg no. 1: Got "TTranslateString", expected "Pointer"
когда пытаюсь ему "подсунуть" указатель на эту строку, начинает ругаться на ErrorList.Items.Add( Stack.Pop ).
Прошу помочь разобраться что не так и как решить этот вопрос.
Заранее огромное спасибо.
qip2005 вне форума Ответить с цитированием
Старый 24.06.2012, 04:59   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Разные классы используете.. присмотритесь - это мега-бревно в коде.
написали одно:
Код:
type
  TStStack = class
пользуетесь другим...
Цитата:
private
Stack: TStack;
public
Спать надо больше
Человек_Борща вне форума Ответить с цитированием
Старый 24.06.2012, 05:41   #3
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Разные классы используете.. присмотритесь - это мега-бревно в коде.
написали одно:
Код:
type
  TStStack = class
пользуетесь другим...


Спать надо больше
Дык на сон как бе не жалюсь)) Спасибо за ошибку)
Ну в общем тем не менее проблемы существуют, при сборке приложения выпадает исключение:

Проект stack вызвал класс исключения 'External: SIGSEGV'.

И грешит на строку:

Result:= FItems[ Count - 1 ]

метода function TStStack.Pop(): string;
qip2005 вне форума Ответить с цитированием
Старый 24.06.2012, 09:52   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Вы забываете в POP декрементировать счетчик.
s-andriano вне форума Ответить с цитированием
Старый 24.06.2012, 11:03   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Проект stack вызвал класс исключения 'External: SIGSEGV'
Гм, а вы уверены, что пишете в Delphi?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 24.06.2012, 11:08   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

вот и я подумал: это ж лазарь!
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 26.06.2012, 09:30   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Код:
function TStStack.Pop(): string;
begin
  if Count = 0 then
    raise Exception.Create('Стек пуст');
  SetLength( FItems, Count - 1 ); 
// и дальше у нас ДРУГОЕ число элементов (возможно =0)
// и того что нам нужно здесь уже точно нет, мы его благополучно удалили предыдущей строкой.
  Result:= FItems[ Count - 1 ];
end;
to s-andriano
Цитата:
Вы забываете в POP декрементировать счетчик.
Код:
SetLength( FItems, Count - 1 );
А разве это не то самое?
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Pascal Stack S1l3nce Помощь студентам 0 22.09.2011 15:47
STACK Lawliet32 C# (си шарп) 2 31.03.2011 14:04
Stack Overflow Xeonc Общие вопросы C/C++ 3 22.10.2010 08:07
Stack OverFlow Tanya2008 Общие вопросы Delphi 6 11.05.2009 15:16
Помогите со Stack МаксMorfey Помощь студентам 0 10.05.2009 16:37