Форум: "Основная";
Текущий архив: 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