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

Мы не какой-то абстрактный параметр передаем, а ссылку. Если ее не передать, назад ничего не получишь.

Вот это не понял… Побочные эффекты не являются нормой сегодня. Передачу параметров в/из процедуры нельзя считать побочным эффектом: как может быть побочным эффект, описанный в техзадании? Вот если бы из процедуры глобальные переменные меняли – то да. Но в этом случае о чистоте говорить уже не приходится…

По определению термина “побочный эффект”. Изначально он был придуман для функций, которые кроме результирующего значения могли менять значения своих параметров, но был определен именно как изменение значения параметра, заданного при входе в программную единицу. Т.е. параметр передавал подпрограмме какое-то значение, но при этом сам мог измениться. Поэтому получается, что любой read-write параметр фактически использует побочный эффект. Только у процедур его не называют таковым. Но ведь мы знаем языки, в которых нет процедур, только функции, поскольку любая из них всегда возвращает некоторое значение. И что, там нельзя говорить о побочном эффекте?

1 лайк

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

Наверное, правильнее говорить, что побочный эффект подпрограммы состоит в дополнительном, не предусмотренном её интерфейсом изменении глобального состояния программы. В противном случае и вызов var y := sin(x) можно окрестить “побочным эффектом” на том основании, что ведь y изменилась…

Что касается функциональных языков, то там чистота функций часто прописана прямо в катехизисе :slight_smile: Так что говорить о побочном эффекте можно, но сделать его нельзя (неположено!) :slight_smile:

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

В принципе, да.

Не понимаю, что тут происходит, ввожу три числа, ждет еще ввода. Ввожу еще одно, это число попадает в индекс максимального при выводе результата. Ерунда какая-то.

begin
  ReadSeqInteger(3).Numerate.MaxBy(x -> x[0]).Println;
end.

#1815

Хотя ваши симптомы не очень совпадают.

P.S. А, ну да…

.MaxBy(x -> x[0])

Вы же индексы а не числа сравниваете. Надо [1]. В итоге, у вас просто скипает первое введённое число, из за той issue, а остальное ваша ошибка.

Всегда когда не уверены каким элементов кортежа будет индекс - наводите мышку на .Numerate, там всё видно.

Да, там ошибка, надо .MaxBy(x->x[1]) Но ничего не меняется, все так же, первый элемент не учитывается.

Внимательно прочитайте мой ответ.

Похоже, ерунда происходит. Первое введенное значение в MaxBy не учитывается для недетерминированных последовательностей. %D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

uses Graph3D;
 
begin
  Graph3D.View3D.ShowGridLines := false;
  
  var SideA := Polygon3D(Arr(
    P3D(3,0,1),
    P3D(3,0,2),
    P3D(1,0,2),
    P3D(1,0,3),
    P3D(3,0,3),
    P3D(3,0,4),
    P3D(0,0,4),
    P3D(0,0,1)
  ));
  var SideB := SideA.Clone;
  SideB.MoveOn(0,1,0);
  
  var g := new Group3D(1.5,0.5,2.5, Arr&<Object3D>(SideA, SideB));
  g.AnimScale(2).AutoReverse.Forever.Begin;
end.

Это нормально что этот код не работает, выдавая какую то внутреннюю ошибку?

Graph3D.pas(375) : Ошибка времени выполнения: Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.

Нормально. Пишите так:

  var g := Group(SideA, SideB);

Group3D - это сервисный класс, в прикладном коде не должны конструироваться его объекты

1 лайк

Почему False для строк ‘n’ и ‘N’?

begin
  var a: array of string := ('n', 'N', 'not', 'Not');
  var s: set of string := ['n', 'N', 'not', 'Not'];
  foreach var x in a do
    Print(x in s) // False False True True 
end.

Это так же ломает и in, потому что к char пытается применить сравнение строк.

1 лайк

Похоже, дыра. Поскольку:

begin
  var a: array of string := ('n', 'N', 'not', 'Not');
  var ss:=Seq&<string>('n', 'N', 'not', 'Not');
  var s1:=HSet(ss);
  foreach var x in a do
    Print(x in s1); // True True True True 
  Println;
  var s2:set of string;
  foreach var x in ss do
    Include(s2,x);
  foreach var x in a do
    Print(x in s2); // True True True True  
end.

Вообще, конечно, Н.Вирт со своим стремлением к академичности натворил при создании Паскаля дел, которые расхлебывать совсем непросто. Самое забавное, что он потом это сам признал, создавая на базе Паскаля языки семейства Модула (которые тоже признал не сильно удачными), а на базе Модула он создал Оберон. Наблюдать за этими исканиями в историческом аспекте весьма интересно.

В Модула Н.Вирт убрал оператор GOTO, цикл FOR (!), перечислимые и диапазонные типы данных, записи с вариантами, а нижнюю границу индекса массива зафиксировал нулем, как в языках семейства С. В операторах языка исчез BEGIN, но зато стал обязательным END. Потом Н.Вирт “одумался” и в язык Оберон-2 оператор цикла FOR был с триумфом возвращен, причем с факультативным довеском BY, позволяющим определять шаг изменения управляющей переменной.

И, наконец-то, была устранена противная путаница символов и строк. Что мы имеем в языке Паскаль? В выражении ‘123’ + ‘4’ + ‘56’ что такое ‘4’ - строка длиной один символ или просто символ? Символ. А если по синтаксису требуется именно строка? В Оберон было принято простое, пусть не лучшее решение: одиночные символы нужны редко и поэтому имеют вид шестнадцатиричных констант, а все, что записывается в одиночных или парных апострофах - это строки. Другое (и превосходное!) решение принято в С# - ограничители разного вида для символов и строк.

2 лайка

Интересный текст, но какое отношение он имеет к теме?)))

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

2 лайка
uses Graph3D;
 
begin
  Graph3D.View3D.ShowGridLines := false;
  
  var SideA := Polygon3D(Arr(
    P3D(3,0,1),
    P3D(3,0,2),
    P3D(1,0,2),
    P3D(1,0,3),
    P3D(3,0,3),
    P3D(3,0,4),
    P3D(0,0,4),
    P3D(0,0,1)
  ));
  var SideB := SideA.Clone;
  SideB.MoveOn(0,1,0);
  
  SideA.Color := GColor.FromArgb(255,255,0,0);
  SideB.Color := GColor.FromArgb(255,0,255,0);
  
  Group(SideA, SideB).AnimScale(2).AutoReverse.Forever.Begin;
end.

Этот код меняет только цвет линий. А как можно закрасить многоугольники? И есть ли вообще такое в Graph3D?

Вообще, обычно в 3D графике Polyline это сами линии, а Polygon это залитая фигура.

Пока никак.

То, о чем Вы говорите, это в 2D-графике. А в 3D-графике Polygon может не давать плоскую грань.