Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизПро динамическую память Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.04 c