Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Ошибка в реализации очереди?   Найти похожие ветки 

 
WELLiON   (2005-03-16 16:34) [0]

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

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".
Заранее благодарен. Я хочу нормально реализовать стек, дек и очередь в дельфи и выложить код где-нибудь у вас на сайте или в другом месте. Я искал в инете и нормальных реализаций не нашел.


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


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


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


 
MBo ©   (2005-03-16 16:38) [2]

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


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

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


 
begin...end ©   (2005-03-16 16:40) [4]

> WELLiON   (16.03.05 16:34)

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

> Queue.Create;


 
WELLiON   (2005-03-16 16:45) [5]


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


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


 
WELLiON   (2005-03-16 16:47) [6]

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


 
Digitman ©   (2005-03-16 16:51) [7]


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


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


 
Zeqfreed ©   (2005-03-16 16:52) [8]

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


 
begin...end ©   (2005-03-16 16:52) [9]

> WELLiON   (16.03.05 16:45) [5]

Queue := TQueue.Create;


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


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


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

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


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

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


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


>  бросил

бросились

:)


 
WELLiON   (2005-03-16 16:55) [13]

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

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.


 
begin...end ©   (2005-03-16 16:57) [14]

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


 
WELLiON   (2005-03-16 16:59) [15]

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


 
Просто Джо ©   (2005-03-16 17:01) [16]


> А что нет конструктора - это не принципиально. Нет желания
> пока с этим разбираться.


Прошу задуматься над этими словами.


 
Zeqfreed ©   (2005-03-16 17:02) [17]

Лучше все-таки книги почитать.
Но, что самое смешное - стэк действительно работает.


 
WELLiON   (2005-03-16 17:02) [18]

Вы мастера не только в дельфях, но и игре на нервах! Косяк какой-то вышел, когда я пытался сделать конструктор. Я решил, что пока обождёт. А вы что, код не читаете, если в нем не реализован конструктор?


 
WELLiON   (2005-03-16 17:04) [19]

Что стек работает - меня больше всего убивает. У меня есть сишный код, который мы в свое время писали в универе. Я его переводил на дельфи. Стек работает, а очередь - нет. Потому и решил с вами проконсультироваться. А реализацию класса будет доделывать, когда прога заработает.


 
WELLiON   (2005-03-16 17:06) [20]

2Просто Джо, [16]: я имею в виду в данном конкретном случае. Прога не заработает, если я сделаю конструктор.


 
begin...end ©   (2005-03-16 17:06) [21]

> WELLiON   (16.03.05 17:04) [19]

> А реализацию класса будет доделывать, когда прога
> заработает.

Ваша программа не заработает правильно до тех пор, пока не будут "доделаны" все её составляющие. В том числе, и классы.


 
Игорь Шевченко ©   (2005-03-16 17:09) [22]


> Но, что самое смешное - стэк действительно работает.


Это глюк компилятора


 
WELLiON   (2005-03-16 17:09) [23]

2begin...end : ок. Будем работать. Но почему очередь не работает-то? Потому что, перед процедурой Create нет слова constructor? Сильно сомневаюсь. Тут что-то другое. А про классы - я с Вами согласен. Доделаю конструктор, и будем говорить дальше.
Я пошел. Рабочий день закончился. Спасибо.


 
Zeqfreed ©   (2005-03-16 17:10) [24]

Игорь Шевченко ©   (16.03.05 17:09) [22]
Ну я надеюсь, что это не ошибка во всех книжках по паскалю )


 
Japp   (2005-03-16 17:31) [25]

WELLiON   (16.03.05 17:09) [23]
Но почему очередь не работает-то? Потому что, перед процедурой Create нет слова constructor? Сильно сомневаюсь
Давно так не веселился ...!!!
А кто память под объект добывать будет - Билл Гейтс?!!!!


 
Игорь Шевченко ©   (2005-03-16 17:41) [26]


> Ну я надеюсь, что это не ошибка во всех книжках по паскалю
> )


А причем тут паскаль ?


 
Zeqfreed ©   (2005-03-16 17:49) [27]

Игорь Шевченко ©   (16.03.05 17:41) [26]
Я имел ввиду Object Pascal. Выразился несколько неточно.


 
Игорь Шевченко ©   (2005-03-16 17:51) [28]

Zeqfreed ©   (16.03.05 17:49) [27]

Есди не секрет, в какой книжке по Object Pascal рекомендуется выполнять процедуру Create объекта, указатель на который равен nil ?


 
Zeqfreed ©   (2005-03-16 18:30) [29]

Игорь Шевченко ©   (16.03.05 17:51) [28]
Кажется, я был неправильно понят. Я как раз и имел в виду, что хотелось бы надеяться, что это глюк компилятора. В противном случае, книги по Object Pascal врут, говоря, что вызывать методы экземпляра класса, до создания этого самого экземпляра нельзя. Надеюсь, сейчас, я выразился более-менее понятно.


 
Игорь Шевченко ©   (2005-03-16 18:41) [30]

Zeqfreed ©   (16.03.05 18:30) [29]


>  В противном случае, книги по Object Pascal врут, говоря,
> что вызывать методы экземпляра класса, до создания этого
> самого экземпляра нельзя


Нет, книжки вряд ли врут. Методы, кстати, вызывать можно, если они не виртуальные, а вот обращаться к полям ну никак нельзя :)


 
Zeqfreed ©   (2005-03-16 19:07) [31]

Игорь Шевченко ©   (16.03.05 18:41) [30]
Ух-ты. Проверил - действительно методы не обращающиеся к полям корректно работают, вроде об этом нигде не читал. Спасибо за полезную информацию.


 
wicked ©   (2005-03-16 19:36) [32]


> Ух-ты. Проверил - действительно методы не обращающиеся к
> полям корректно работают, вроде об этом нигде не читал.
> Спасибо за полезную информацию.

советую не сильно радоваться - это просто особенность реализации ООП... они не должны работать...


 
Димон   (2005-03-16 20:06) [33]


>  [8] Zeqfreed ©   (16.03.05 16:52)

инога ничего страшного. Вспомни free...


 
begin...end ©   (2005-03-16 20:07) [34]

> Димон   (16.03.05 20:06) [33]

...и классовые методы.


 
Anatoly Podgoretsky ©   (2005-03-16 20:23) [35]

Japp   (16.03.05 17:31) [25]
Не отбивать хлеб у Александра Сергеевича!



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.046 c
1-1110412810
asdprog
2005-03-10 03:00
2005.03.27
редактор delphi 5


3-1109261113
SergP
2005-02-24 19:05
2005.03.27
Как правильно написать select ... in по двум полям?


3-1109053846
WondeRu
2005-02-22 09:30
2005.03.27
MSSQL. Настройка репликации


1-1110296748
rolex
2005-03-08 18:45
2005.03.27
Увеличится ли скорость в моём случае если я сделаю 2 потока?


3-1109362678
ali_tash
2005-02-25 23:17
2005.03.27
как войти в базу FireBird если не знаеш пароля ?