(1 курс ФИИТ) ОП - лекц - 2015 (устарело)


#92

Для каких списков? Там public есть?


#93

Да, с public работает. Но почему раньше работало и без него?


#94

Мне Админ говорил, что с самого начала только паблик и печатало. Может, вы что-то путаете… ну, или он :slight_smile:


#95

Приведите пожалуйста код. Код - лучшее доказательство.


#96

Для односвязных списков конечно. С двусвязными так не поработаешь, мешают ссылки на предыдущий элемент, выводится слишком много всего=)


#97

Опубликуйте код. У нас всё работает


#98

Какой код? Для односвязных списков Ulysses уже объяснил мне, что дело было в public. Для двусвязных списков у меня переполняется стек, если пробовать его вывести обычным Writeln. Я и не думал, что это будет работать. Или это должно работать?


#99

Опубликуйте текст программы, которая не работает.

Не публикуйте скриншоты. Мы их не умеем запускать.


#100
type
  DNode<T> = auto class
  public
    data: T;
    prev, next: Dnode<T>;
  end;
  DList<T> = (DNode<T>, DNode<T>);

begin
  var first := new DNode<integer>(1, nil, nil);
  var last := new DNode<integer>(2, first, nil);
  first.next := last;
  Writeln(first);
end.

#101

О, автокласс, а что ж вы на занятии не рассказали…


#102

Если сделать без автокласса, то будет даже что-то выводиться.

type
  DNode<T> = class
  public
    data: T;
    prev, next: DNode<T>;
    constructor(data: T; prev, next: DNode<T>);
    begin
      self.data := data;
      self.prev := prev;
      self.next := next;
    end;
  end;
  DList<T> = (DNode<T>, DNode<T>);

begin
  var first := new DNode<integer>(1, nil, nil);
  var last := new DNode<integer>(2, first, nil);
  first.next := last;
  Writeln(first);
end.

Как я понимаю, вывод этих элементов зацикливается из-за ссылки на предыдущий. Но почему так не возникает переполнения стека?

Объясните, пожалуйста.


#103

Ага, понятно.

С автоклассами тоже должно выводиться. Если бы Вы не зациклили список, то вывелось бы, а так заработали переполнение стека.

Так всё выводится:

type
  DNode<T> = auto class
    data: T;
    prev, next: Dnode<T>;
  end;

begin
  var first := new DNode<integer>(1, nil, nil);
  var last := new DNode<integer>(2, first, nil);
  Writeln(last);
end.

Вывод без автоклассов не зацикливается. В этом случае он более интеллектуальный - как раз отслеживаются вот такие циклические структуры данных. Вывод прерывается при определенной глубине рекурсии - как раз для таких случаев чтобы исключить переполнение стека. Вместо оставшегося ставится …

Собственно, перед Вами - бесконечный список из чередующихся 1 и 2. Всё верно.


#104

Спасибо, теперь всё понятно.


#105

кстати, что будет со всей информацией по нашему бывшему 1 курсу(ныне 2) (на форуме) ?будет она как-то меняться?


#106

Наша тема по практике уже в архиве. Было бы неплохо перенести и эту тему туда, а для первокурсников создать новую такую же.


#107

#108