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

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

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

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-ветке. Иначе всё забудется и потеряется.

При пошаговом выполнении программы невозможно ни сфокусироваться на окне “Графика WPF”, ни свернуть все окна.

Готово, ссылка под цитируемым сообщением.

Да, забыл поставить not перед Odd(i) then.

“IDE-ветка” — это https://github.com/pascalabcnet/pascalabcnetide? В противном случае я совершил ошибку, создав 7 нижеприведённых Issue в https://github.com/pascalabcnet/pascalabcnetide/issues :

  1. https://github.com/pascalabcnet/pascalabcnetide/issues/185
  2. https://github.com/pascalabcnet/pascalabcnetide/issues/186
  3. https://github.com/pascalabcnet/pascalabcnetide/issues/187
  4. https://github.com/pascalabcnet/pascalabcnetide/issues/188
  5. https://github.com/pascalabcnet/pascalabcnetide/issues/189
  6. https://github.com/pascalabcnet/pascalabcnetide/issues/190
  7. https://github.com/pascalabcnet/pascalabcnetide/issues/191

i.IsEven

Я давно изменил if not Odd(i) then на if i.IsEven then в последующих упоминаниях программы.

Это вообще ошибка? Для неё тоже создать Issue?

Я создал: https://github.com/pascalabcnet/pascalabcnetide/issues/192.

Думаю, нет

С ReadLexem можно удобно читать 1 слово из ввода, вместо того чтоб читать всю строку, резать её на массив слов и потом копаться в массиве:

begin
  'Введите 2 слова:'.Print;
  var w1 := ReadLexem;
  w1.Println;
  var w2 := ReadLexem;
  w2.Println;
end.

А нельзя ли ему, как всем остальным Read*, параметр для строки-приглашения к вводу, чтоб не выделять его в отдельную строку?

ReadLexem нами создавалась как такая внутренняя. Странно, что это кому-то сильно нужно

Я понимаю, это в основном для личной реализации вещей вроде ReadUInt16, если кому то вдруг такое понадобится.

Но читать ввод по 1 слову тоже полезно! И ReadLexem уже делает именно это. Даже пробелы удаляет до и после слова.

Предлагаю обсудить целесообразность расширения ## и ### в конце нулем: ##0 или ###0 …для нумерации срок с 0, чтобы отдельно инструкцию компилятору не писать

Здесь надо вовремя остановиться.

Мы писали ## для командного режима.

Выяснилось, что это страшно востребовано с другими целями :slight_smile: Вы - третий или четвёртый с подобным предложением

2 лайка

Еще как востребовано. Особенно в контексте Компьютерного ЕГЭ

1 лайк