Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.037 c
4-1108561162
Чел@век
2005-02-16 16:39
2005.03.27
Установка сервиса


1-1110364233
BALU1111
2005-03-09 13:30
2005.03.27
Создание компонент на форме


1-1110879559
BorisUK
2005-03-15 12:39
2005.03.27
по группировке в FastReports


9-1104670923
Micker2
2005-01-02 16:02
2005.03.27
DelphiX.2d аркада.Спроверка столкновения


14-1110369170
Ega23
2005-03-09 14:52
2005.03.27
"Не активна" или "Неактивна"?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский