Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Такой вопрос. Впервый раз добавление записи в список проходит нормально, а когда начинаешь добавлять запись в список 2 раз, то список портиться.

Автор: alex457 21.04.2012 22:53

Такой вопрос. Впервый раз добавление записи в список проходит нормально, а когда начинаешь добавлять запись в список 2 раз, то список портиться. Помогите плиз.

 
program ttts;
uses crt;
Type Symbol = record
Surname: String;
Name: String;
{ Fullname: String;
Bhirtday: String;
Pol: String;
Identity: String;
DateCreate: String;
DateEnd: String;
Adres: String;}
end;
type Item = ^Pointer;
Pointer = record
key: integer;
str: Symbol;
Next: Item;
end;
var f: file of Symbol;
s: Symbol;
t,tmp,list:Item;
i:integer;
Key:char;

procedure AddRecord;
var tmp: Item;
begin
ClrScr;
writeln(i);
writeln('Vvedite name');
Readln(s.Name);
writeln('vvedite fam');
Readln(s.Surname);
if (list = nil) then
begin
GetMem(List, sizeof(Item));
tmp:= List;
end
else
begin
tmp:=List;
while (tmp^.next <> nil) do tmp:=tmp^.next;
GetMem(tmp^.Next, sizeof(Item));
tmp:=tmp^.next;
end;
tmp^.next:= Nil;
inc(i);
tmp^.key:=i;
tmp^.str := s;
writeln('OK');
end;

procedure ViewRecords ;
begin
ClrScr;
writeln('SPISOK');
t:=List;
while(t <> nil) do
begin
writeln(t^.key, ' ',t^.str.Name,' ',t^.str.Surname);
t:=t^.next;
end;
end;
procedure home;
begin
ClrScr;
writeln('F1 - „®Ў*ў«Ґ*ЁҐ §*ЇЁбЁ');
writeln('VNIZ - ‚лў®¤ §*ЇЁбҐ©');
writeln('VVERx - „®¬*и*пп бва**Ёж*');
end;
begin
i:=0;
ClrScr;
home;
List:=nil;
repeat
Key:=Readkey;
case Key of
#59: AddRecord;
#72: ViewRecords;
#80: home;
end;
until Key = #79;
end.


Автор: -Федосеев Павел- 22.04.2012 0:51

Обрати внимание, что Item - это указатель, а не запись (record). Особенно внимательно в строках с выделением памяти для следующего элемента списка GetMem.

Автор: alex457 22.04.2012 1:09

Цитата(-Федосеев Павел- @ 21.04.2012 20:51) *

Обрати внимание, что Item - это указатель, а не запись (record). Особенно внимательно в строках с выделением памяти для следующего элемента списка GetMem.


Отлично, спасибо большое за подсказку. Все дело было c выделением памяти. Помогла замена getMem на new

Автор: Lapp 22.04.2012 11:35

alex457, что тут такого продвинутого в твоем программировании? То, что ты не можешь список нормально организовать?? В следующий раз, пожалуйста, создавай тему в Задачах.

Тема переносится..