Помощь новичкам

Подскажите, как зациклить двусвязный список? Что-то не пойму :thinking:

begin
  var lls := LLst('North', 'West', 'South', 'East');
end.

Никак. .NET коллекции доступны только на чтение. Надо сразу работать с узлами LinkedListNode.

Не получается, или я что-то не то делаю…

begin
  var p1 := new LinkedListNode<char>('A');
  var p2 := new LinkedListNode<char>('B');

  p1.Next := p2; //Свойство Next не имеет метода для записи
  p1.Previous := p2;

  p2.Previous := p1;
  p2.Next := p1
end..

The LinkedList<T> class does not support chaining, splitting, cycles, or other features that can leave the list in an inconsistent state.

Напишите свой класс связного списка чтоб это работало.

Ааа я думал, что тут уже все встроено, берешь и пользуешься, оказывается надо свой класс писать. А почему, кстати нет встроенного, чтоб и на запись тоже?

Потому что защиту от дурака не сделаешь, наверное… А разрабам .Net явно нравилось пихать её всюду где надо и не надо.

begin
  var x := [1..'4']; // set of integer 
  var y := ['1'..4]; // set of char 
end. 

Это правильное поведение или ошибка?

begin
  var x := [1..'4']; // set of integer
  Writeln(x);
  var s1 := 0;
  foreach var e1 in x do
    s1 += e1;
  Writeln('s1=',s1);
  var y := ['1'..4]; // set of char 
  Writeln(y);
  var s2 := '';
  foreach var e2 in y do
    s2 += e2;
  Writeln('s2=',s2);
end.
{52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1}
s1=1378
{}
s2=

Интереснее, если

var y := ['1'..52]; 

Потому что там никакое не set of char, это баги анализатора кода:

begin
  var x := [1..'4']; // set of integer
  Writeln(x);
  Writeln(x.Cast&<object>.FirstOrDefault?.GetType);
  var s1 := 0;
  foreach var e1 in x do
    s1 += e1;
  Writeln('s1=',s1);
  var y := ['1'..52]; // set of char 
  Writeln(y);
  Writeln(y.Cast&<object>.FirstOrDefault?.GetType);
  var s2 := '';
  foreach var e2 in y do
    s2 += e2;
  Writeln('s2=',s2);
end.

То есть в обоих случаях set of integer.

1 лайк

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

var s: set of char;

begin
    s := ['1'..4];
    writeln(2);
end.

не компилируется а

var s: set of char;

begin
    s := [1..'4'];
    writeln(2);
end.

компилируется

1 лайк

@ibond:

О, сколько нам открытий чудных
Готовит просвещенья дух...
1 лайк

Задача из “Абрамяна” - Dynamic66 Написать процедуру SplitList(L1, L2) разделения списка на две части. Параметры процедуры имеют тип TList; первый параметр является входным и выходным, второй — выходным. Непонятно насчет второго параметра. Как это, если параметр не входной, но выходной?

Возвращаемым значением.

Не понимаю. Тогда это уже функция, а не процедура. Лучше всего второй список создавать внутри подпрограммы, чтобы не передать по второму параметру не то, что нужно (не пустой второй список). Но там прямо написано процедура и название с двумя параметрами SplitList(L1, L2). Если функция, тогда все понятно, входной и выходной параметр один - первый список, возвращается второй список. С функцией я то сделал. Но процедура…

Вообще, в других языках (в основном в давно сдохших, но C# тут исключение) есть out параметры (как var параметры, но их нельзя читать и им надо присвоить значение до выхода из метода). Обычно это использовалось чтоб вернуть сразу много значений.

Если надо возвращать несколько значений - в наш век используют кортежи. А тут и то не надо, возвращают то только 1 значение.

Если автор говорит сделать единственное возвращаемое значение параметром процедуры - лучше найдите другого, этот кажись каких-нибудь фортранов/доисторических паскалей накурился. Ну а если серьёзно - это идёт против современных принципов программирования и не_писания говнокода. Если метод возвращает значение - это должна быть именно функция а не процедура.

Видимо, Вы ничего не слышали о том, что функции, как и процедуры, могут иметь побочный эффект. Только для процедур побочный эффект - это норма.

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

Оба var. “Выходной” означает, всего лишь, что соответствующий фактический параметр не инициализируется.

Но формально мы же его туда передаем? Значит он тоже входной. Кроме того, можно передать и не то, что нужно, хотя это вряд ли, конечно, но всякое бывает.