Подскажите, как зациклить двусвязный список? Что-то не пойму
begin
var lls := LLst('North', 'West', 'South', 'East');
end.
Подскажите, как зациклить двусвязный список? Что-то не пойму
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
.
говнокод какой-то. это вообще не должно компилироваться. и интеллисенс не причем. в остальных паскалях еще хуже
var s: set of char;
begin
s := ['1'..4];
writeln(2);
end.
не компилируется а
var s: set of char;
begin
s := [1..'4'];
writeln(2);
end.
компилируется
Задача из “Абрамяна” - Dynamic66 Написать процедуру SplitList(L1, L2) разделения списка на две части. Параметры процедуры имеют тип TList; первый параметр является входным и выходным, второй — выходным. Непонятно насчет второго параметра. Как это, если параметр не входной, но выходной?
Возвращаемым значением.
Не понимаю. Тогда это уже функция, а не процедура. Лучше всего второй список создавать внутри подпрограммы, чтобы не передать по второму параметру не то, что нужно (не пустой второй список). Но там прямо написано процедура и название с двумя параметрами SplitList(L1, L2). Если функция, тогда все понятно, входной и выходной параметр один - первый список, возвращается второй список. С функцией я то сделал. Но процедура…
Вообще, в других языках (в основном в давно сдохших, но C# тут исключение) есть out
параметры (как var
параметры, но их нельзя читать и им надо присвоить значение до выхода из метода). Обычно это использовалось чтоб вернуть сразу много значений.
Если надо возвращать несколько значений - в наш век используют кортежи. А тут и то не надо, возвращают то только 1 значение.
Если автор говорит сделать единственное возвращаемое значение параметром процедуры - лучше найдите другого, этот кажись каких-нибудь фортранов/доисторических паскалей накурился. Ну а если серьёзно - это идёт против современных принципов программирования и не_писания говнокода. Если метод возвращает значение - это должна быть именно функция а не процедура.
Видимо, Вы ничего не слышали о том, что функции, как и процедуры, могут иметь побочный эффект. Только для процедур побочный эффект - это норма.
Все гораздо проще. Там эти задачки написаны для Паскаля, в первую очередь, я так думаю. И я не врубаюсь, как у процедуры с двумя параметрами может быть один входно-выходной, а второй просто выходной.
Оба var. “Выходной” означает, всего лишь, что соответствующий фактический параметр не инициализируется.
Но формально мы же его туда передаем? Значит он тоже входной. Кроме того, можно передать и не то, что нужно, хотя это вряд ли, конечно, но всякое бывает.