Замечания и предложения

https://pascalabcnet.github.io/mydoc_for_EGE.html

Затем мы вновь делаем цикл по всем элементам, но поскольку нам некоторые надо менять, фильтрация с помощью Where нам не поможет - она лишь отбирает элементы, но “забывает” про их индексы. Поэтому просто проверяем условие a[i] mod 6 <> 0 как в оригинальном решении

В этом случае лучше использовать .Transform.

a.Transform(x -> x mod 6 = 0 ? x : k);

Таким образом во всей программе - не придётся иметь дело с индексами. И правильно, в задаче упоминается только работа с данными массива, а не его индексами.

Я не очень понимаю. Зачем выше? Операции - отдельно - они до лямбд

Здесь вопрос методики. Можно и так и так

Конец раздела методов массивов настраивает на “сейчас объяснят лямбды”, но вместо этого сначала даются ещё операции массивов.

Это немного сбивает - логичнее будет если операции массивов (in, + и *) будут или прямо перед разделом с методами массивов, или являться его частью.

То есть:

А вообще, операции * и in используются ещё с самого начала страницы, в само-объясняющем контексте. А операцию + массивов - я ещё не видел куда можно приткнуть в школьных задачках.

http://pascalabc.net/ssyilki-dlya-skachivaniya
Сверху страницы:

PascalABC.NET (версия 3.6.3, сборка 2457 от 07.05.2020)

На коробке одно, а в коробке другое…

Я бы вообще оставил там только версию, без билда и даты, чтобы не отслеживать постоянно.

2 лайка
uses WPFObjects;

begin
  new RectangleWPF(10,10,20,20, Colors.Green);
  Window.Clear(Colors.Red);
end.

Сейчас этот код полностью игнорирует вызов Window.Clear.
@Clash_Royale каким то образом получил ошибку отсюда, но пока он офлайн.

Ну, я так понимаю - Window.Clear принципиально не применимо в WPFObjects… Но надо выдавать нормальную ошибку. Ну или полностью скрыть этот метод.

И, наверное, стоит сделать метод GraphWPFBase.WindowType.Clear абстрактным. То сообщение об ошибке - ещё с 2018 устарело…

Исправили

1 лайк

В описаниях (PABCSystem.pas) повторяются словосочетания:

Возвращает множество на базе на базе бинарного дерева поиска, заполненное диапазоном значений

Возвращает множество на базе на базе бинарного дерева поиска, заполненное заполненный диапазоном значений

Нашёл баг с кнопками сворачивания кода. Имеем следующий код:

image

Нажимаем на минус напротив ## — всё работает нормально:

image

Нажимаем на минус напротив var a := ArrRandomInteger; — появляется это:

image

Нажимаем на плюс напротив ## — появляется это:

image

Нажимаем на плюс — снова появляется

image

И так бесконечно. Чтобы выбраться, приходится нажимать на стрелки.

Исправили. Спасибо

Мне кажется, что ещё во многих стандартных описаниях есть недочёты, такие как отсутствие продолжения предложения или лишние слова.

Если попытаться открыть окно дизассемблирования, написав программу

begin

end.

появится ошибка.

Если нажать “настроить задачник PT4” и запретить через окно “Контроль учётных записей” “этому приложению от неизвестного издателя вносить изменения на вашем устройстве”, то появится ошибка.

Укажите, где

Мне кажется, при выполнении моей программы для симуляции росписи ручки не работает пошаговая отладка и var point1: Point := RandomPoint(w).

Код программы:

uses GraphWPF;

begin
  var a: array of (Point, Point);
  SetLength(a, ReadlnInteger);
  var w := ReadlnReal;
  var point1: Point := RandomPoint(w);
  var point2: Point;
  for var i := 0 to a.Length - 1 do
  begin
    if Odd(i) then
    begin
      point2 := RandomPoint(w);
      a[i] := (point1, point2);
    end
    else 
    begin
      point1 := RandomPoint(w);
      a[i] := (point2, point1);
    end;
  end;
  Lines(a);
end.

Не говорите “не работает”. Говорите конкретно что не так как вы ожидали, что вы пробовали и т.п.
И приводите минимальный код с которым “не работает”, а не целиком, всё что у вас есть.

При пошаговом выполнении программы кнопки перехода на следующий шаг постоянно сереют и перестают быть активными. Это постоянно происходит при выполнении var point1: Point := RandomPoint(w). Эту строку можно перескочить с помощью точки останова, но тогда кнопки отключатся, например, между операторными скобками ниже.

Если углубиться в подпрограммы, то снова можно заметить, что кнопки перестают реагировать на разных частях стандартных подпрограмм, что может намекнуть на отсутствие связи проблемы с обработкой определённой строки кода.

"Не работает var point1: Point := RandomPoint(w)":

Мне кажется, до начала сохранения первой линии, в связи с выполнением строки var point1: Point := RandomPoint(w), для точки 1 должно выбраться случайное место в пределах w, но этого никогда не происходит. Вместо случайного выбора, точке 1 присваиваются координаты 0, 0 по умолчанию в левом верхнем углу окна.

Если что, не исправили (разверните цитируемое сообщение):

Нашёл ещё ошибку (давно заметил и давно искал способ воспроизведения):
Берём бесполезный код-пример:

begin
  Writeln('1132445');
  var x:=ReadlnInteger;
  Writeln(x*5+x);
  loop 9 do x+=x*2;
end.
  1. Вставляем его в редактор IDE.
  2. Отлаживая, доходим до середины:
  3. Вдруг хотим что-то изменить, не останавливая отладку (чтобы сработало, поменяю всё, скажем, на этот (https://pascalabcnet.github.io/mydoc_release_notes_3_7.html#в-ide-интегрирована-библиотека-nunit) пример):
  4. Теперь уже ничего не спасёт от ошибки “() : Не могу получить доступ к файлу ‘C:\PABCWork.NET\Output\Program1.exe – 4 System.UnauthorizedAccessException: Отказано в доступе по пути “C:\PABCWork.NET\Output\Program1.pdb”. в System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) в System.IO.File.InternalDelete(String path, Boolean checkHost) в PascalABCCompiler.Compiler.Compile()’” и программы невозможно будет запустить, пока не перезагружу IDE:

Если быстро вводить значения, возможно ввести их между сообщениями Writeln, что было не предусмотрено:

Если быстро нажимать на кнопку “Выполнить”, возможно наложение вывода:

Пишу я программу, ввожу операторные скобки после while true do, а автозавершение кода выдаёт end., вместо end;, да ещё сворачивание выглядит коряво:

image

Около end. присутствует окончание сворачивания кода, хотя остальной части нет:

Думаю, что по аналогии с операторными скобками

следует изменить оформление сворачивания кода для префиксов (убрать вторую кнопку сворачивания):

Жду с нетерпением добавления многого для decimal:

Кхм, я такое видел, но редко. Если у вас получается стабильно воспроизвести - это прекрасно! Так эту гадость хотя бы реально поймать.

И может стоит отдельную тему создать, как в своё время для плавающей Ctrl+Z? С ней примерно так же было.

По делу, из информации что стоит добавить - попробуйте заснять на видео, а то на словах тут легко потерять детали.
Ну и на всяк назовите основные характеристики системы. К примеру версию винды, битность, установленные версии .Net Framework…

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

uses GraphWPF;

begin
  Writeln(RandomPoint(0));
end.

Тут выводит случайную точку. Значит есть 2 варианта:

  1. Проблема воспроизводится на более сложном коде. То есть надо брать исходный код и убирать из него по 1 строчке, пока не перестанет воспроизводится.
  2. Ошибка в логике вашего кода. Спойлер алёрт - в данном случае это правильный вариант.

Ваша проблема в первую очередь в плохом стиле кода. Вы используете пустое значение Point как изначальное. Но это значение воспринимается подпрограммой Lines как вполне валидное. Поэтому программа молча продолжает выполнятся, но выдаёт странный результат.

Если использовать Nullable значение nil как изначальное - программа выдаст ошибку прямо там, где вы ошибочно используете изначальное значение:

uses GraphWPF;

begin
  var a: array of (Point, Point);
  SetLength(a, ReadlnInteger);
  var w := ReadlnReal;
  var point1: Point? := RandomPoint(w);
  var point2: Point? := nil; // Point? = System.Nullable<Point>
  for var i := 0 to a.Length - 1 do
  begin
    if Odd(i) then
    begin
      point2 := RandomPoint(w);
      a[i] := (point1.Value, point2.Value);
    end
    else 
    begin
      point1 := RandomPoint(w);
      a[i] := (point2.Value, point1.Value);
    end;
  end;
  Lines(a);
end.

А отсюда - уже очень просто понять что вы сделали не так. Это, конечно, довольно простой пример. Но и программа всего на 20 строк. В программах побольше - использование значений как 0 или -1 для обозначения отсутствия значения выглядит просто и эффективно, но приводит к очень сложно-ловимым багам.

Вместо них лучше использовать:

  • Исключения. Просто использовать, но они медленные;

  • Nullable. Они довольно быстрые, потому что хранят только +1 поле типа boolean;

  • Свои типы-контейнеры. У них вообще можно поставить {$ifdef DEBUG}, чтоб проверять на правильность значения только в дебаг режиме (галочка в настройках IDE, по-умолчанию включена / аргумент консольного компилятора, по-умолчанию выключен).

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

Честно говоря я тоже, но разработчики, почему то, относятся к нему как к изгою. То есть хотите с ним работать - объявляйте свои подпрограммы, типа таких:

function ReadDecimal := Decimal.Parse(ReadLexem);
function ReadlnDecimal := Decimal.Parse(ReadString);

Напишите Issue - сделаем. Там же надо сделать тогда это везде - и в обычном Read и с приглашением к вводу и с текстовыми файлами.

Вообще, по тексту выше на каждую надо сделать Issue в IDE-ветке. Иначе всё забудется и потеряется.