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

Вниз

Про динамическую память   Найти похожие ветки 

 
Maxwell   (2004-03-22 22:32) [0]

ээ... не совсем коректное название топика, ну да ладно. короче говоря, по причине поступления в университет перехожу с моего любимого CPP на Delphi. Вот, проходим структуры данных. Стек мне нужно сделать. Ну... по аналогу с Си, создаю структуру данных:
type
 ListElement = record
     data: String;
     next: ^ListElement;
 end;
в ответ - ошибка на Next: ^ListElement; - "Type ListElement is not yet completely defined"
А как тогда делают??


 
Zacho ©   (2004-03-22 22:40) [1]

Посмотри класс TStack
Благо, и исходники есть.. И делать самому вообще-то ничего не нужно, всё уже сделано..


 
Maxwell   (2004-03-22 22:48) [2]

это конечно классно, что в делфи как и везде есть стандартный стек, но у меня задание такое - изучение структур данных:стек. А тот, что в contnrs - ну очень в нем тяжело разобраться - во-первых - он дочерний от обычного списка, вобщем - тяжело читается мною еще делфи. меня пока интересует ответ на мой вопрос - почему в структуре, тьфу, в записи нельзя сделать указатель на такую же запись.


 
Юрий Зотов ©   (2004-03-22 22:49) [3]

type
PListElement = ^TListElement;
TListElement = record
  Data: String;
  Next: PListElement
end;

Только для Data лучше использовать ShortString, а не String. Иначе в некоторых случаях могут быть проблемы.


 
Maxwell   (2004-03-22 23:26) [4]

Ага. нечто подобное у меня было с массивами. Понятненько. а вот теперь - создал класс:
type
 MyStack = class
   public
     head : PListElement;
     procedure push (var entry : string);
     function  pop  ():String;
 end;

и функцию:
procedure MyStack.push (var entry:string);
var
 p:PListElement;
begin
New (p);
p^.data:=entry;
p^.next:=head;
head:=p;
end;
ошибка - memory access violation на строке p.next:=head; при выполнении.


 
DrPass ©   (2004-03-22 23:41) [5]

Логично: а в CPP ты разве мог работать с экземпляром класса, не вызвав сперва конструктор?


 
Piter ©   (2004-03-23 00:08) [6]

ListElement = record
    data: String;
    next: ^ListElement;
end;


ошибка - потому что ListElement еще не объявлен, а ты уже делаешь указатель на него. Он будет объявлен после директивы end;
А если надо в записи использовать указатели на нее, то дается опережающее объявление, как показал Юрий Зотов, это некоторое отступление от правил Object Pascal

Maxwell (22.03.04 23:26) [4]
ошибка - memory access violation на строке p.next:=head; при выполнении


А у меня все ок. Вот как тестировал:

procedure TForm1.Button1Click(Sender: TObject);
var
 s:string;
 MS: MyStack;
begin
 s:="Lalala";
 MS:=MyStack.Create ;
 MS.push(s);
 MS.free;
end;


все зашибись выполняется.
Кстати, придерживайся рекомендаций OP, начинай названия классов, записей с буквы T (type)
Типа TMyStack, TListElement - лучше будет



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

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

Наверх




Память: 0.48 MB
Время: 0.036 c
7-1075489491
kolpin
2004-01-30 22:04
2004.04.11
Запись файлов и папок на CD-RW


1-1080300909
WondeRu
2004-03-26 14:35
2004.04.11
Как направить сообщения с консоли в TMemo


4-1079444425
BillyJeans
2004-03-16 16:40
2004.04.11
Окно без title bar...


1-1082853146
val_5
2004-04-25 04:32
2004.04.11
препроцессорная переменная - где компил: D6 или D7


1-1080175040
LoMaster
2004-03-25 03:37
2004.04.11
программа, удаляющая сама себя