Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в реализации очереди? [D7, Win2k]


Страницы:   1 2

WELLiON ©   (2005-03-16 16:34:00) 

Здравствуйте, уважаемые Мастера. Пытаюсь реализовать очередь на дельфях. Стек реализовать уже получилось. Работает. Вот мой код:

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 QData = string;
 PQu = ^Qu;
 Qu = record
   Next: PQu;
   Inf: QData;
 end;

 TQueue = class
   private
     Head: PQu;
     Tail: PQu;
     Length: Integer;
   public
     procedure Create;
     function Pop: QData;
     procedure Push(C: QData);
 end;

function TQueue.Pop: QData;
 var N: PQu; C: QData;
begin
if Head<>nil
 then
   begin
     N:=Head;
     C:=N^.Inf;
     Head:=Head^.Next;
     if Head=nil
       then Tail:=nil;
     Dispose(N);
   end;
Result:=C;
end;

procedure TQueue.Push(C: QData);
 var N: PQu;
begin
 New(N);
 N^.Inf:=C;
 N^.Next:=nil;
 if Head=nil
   then
     begin
       Head:=N;
       Tail:=N;
     end
   else
     begin
       Tail^.Next:=N;
       Tail:=N;
     end;
end;

procedure TQueue.Create;
begin
 Head:=nil;
 Tail:=nil;
 Length:=0;
end;

var Queue: TQueue;

begin
Write('OK');
ReadLn;
Queue.Create;
Queue.Push('Test');
Writeln(Queue.Pop);
Write('OK');
ReadLn;
end.


Может, ошибка плавает на поверхности, и я её не заметил? Дельфа пишет: 'access violation at 0x77f8edab: read of address 0x00000020'.
Заранее благодарен. Я хочу нормально реализовать стек, дек и очередь в дельфи и выложить код где-нибудь у вас на сайте или в другом месте. Я искал в инете и нормальных реализаций не нашел.


WELLiON   (2005-03-16 16:59:00) [21]

Хватит предираться. Лучше бы сказали, где ошибка. Стек работает, а очередь не работает. Код-то практически одинаковый! А что нет конструктора - это не принципиально. Нет желания пока с этим разбираться. Эту проблему решу - сделаю конструктор.


begin...end   (2005-03-16 16:57:00) [22]

Да и Create объявлено как процедура, а не как конструктор...


WELLiON   (2005-03-16 16:55:00) [23]

А почему у меня тогда со стеком все нормально?

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
 SData = string; // stav'te nuzhnuyu
 PSt = ^St;
 St = record
   Next: PSt;
   Inf: SData;
   end;
   
 TStack = class
   private
     Head: PSt;
     Length: Integer;
   public
     procedure Create;
     procedure Destroy;
     procedure Push(C: SData);
     function Pop: SData;
     function GetLength: Integer;
     function Look: SData;
     function Empty: Boolean;
 end;

procedure TStack.Destroy;
 var temp: SData;
begin
 while not self.Empty do
   temp:=self.Pop;
end;

function TStack.Empty: Boolean;
begin
 if Length=0
   then Result:=true
   else Result:=false;
end;

function TStack.Look: SData;
 var temp: SData;
begin
 temp:=Head^.Inf;
 Look:=temp;
end;

procedure TStack.Create;
begin
 Head:=nil;
 Length:=0;
end;

procedure TStack.Push(C: SData);
var N: PSt;
begin
 New(N);
 N^.Inf:=C;
 N^.Next:=Head;
 Head:=N;
 Length:=Length+1;
end;

function TStack.Pop: SData;
var N: PSt; Res: SData;
begin
if Head<>nil
 then
   begin
     Res:=Head^.Inf;
     N:=Head;
     Head:=Head^.Next;
     Dispose(N);
     Length:=Length-1;
   end
 else Res:='';
Pop:=Res;
end;

function TStack.GetLength: Integer;
begin
 GetLength:=Length;
end;

var Stack: TStack;
 t: SData;

begin
 Stack.Create;
 WriteLn('Dlya vihoda nazhmite E.');
 ReadLn(t);
 while t<>'E' do
   begin
     Stack.Push(t);
     ReadLn(t);
   end;
 WriteLn;
 WriteLn('Kolichestvo elementov v steke: ', Stack.GetLength);
 WriteLn('Soderzhimoe steka: ');
 while not Stack.Empty do
   Write(Stack.Pop, ' ');
 WriteLn('Ok');
 ReadLn;
end.


Просто Джо   (2005-03-16 16:54:00) [24]


>  бросил

бросил ись

:)


Просто Джо   (2005-03-16 16:54:00) [25]

И вот, в 16:52все яростно бросил тыкать носом в... это самое :))


Просто Джо   (2005-03-16 16:52:00) [26]


>  [5] WELLiON   (16.03.05 16:45)
>
> > Вот она:
> >
> > > Queue.Create;
>
>
> А что там не так?


Хм. А может пока рано браться за конкурренция с Борландом в виду отсутствия фундаментальных знания по языку?

Queue := TQueue.Create;
try
 // code
finally
 Queue.Free;
end;


Zeqfreed   (2005-03-16 16:52:00) [27]

WELLiON   (16.03.05 16:45) [5]
Книжки читал? Там не так то, что экземпляра Queue ещё нет в памяти, а ты вызываешь его метод.


begin...end   (2005-03-16 16:52:00) [28]

> WELLiON   (16.03.05 16:45) [5]

Queue := TQueue.Create;


Digitman   (2005-03-16 16:51:00) [29]


> WELLiON   (16.03.05 16:47) [6]
> хочу сам написать код,


возьми за образец TQueue, доведи его до своих нужд и не майся дурью.


WELLiON   (2005-03-16 16:47:00) [30]

Я хочу сам написать код, а не пользоваться готовыми библиотеками. Под ключ, так сказать. Хотя я и не подумал, что их включат в стандартные библиотеки. Теперь уже вопрос идет на принцип. %-)


WELLiON   (2005-03-16 16:45:00) [31]


> Вот она:
>
> > Queue.Create;


А что там не так?


begin...end   (2005-03-16 16:40:00) [32]

> WELLiON   (16.03.05 16:34)

Про стандартные классы уже сказали. Что же касается Вашего кода, то, по крайней мере, одна ошибка действительно плавает на поверхности. Вот она:

> Queue.Create;


Просто Джо   (2005-03-16 16:38:00) [33]

удивительно е


MBo   (2005-03-16 16:38:00) [34]

загляни в модуль Contnrs.pas


Просто Джо   (2005-03-16 16:37:00) [35]


>  Я искал в инете и нормальных реализаций не нашел.


классы TStack, TList, TQueue и другие из стандартной поставки Делфи. Плохо искал.
"Удивительно рядом" (с) Ю.Зотов ;)


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо