Мне кажется, что ещё во многих стандартных описаниях есть недочёты, такие как отсутствие продолжения предложения или лишние слова.
Если попытаться открыть окно дизассемблирования, написав программу
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.
Теперь уже ничего не спасёт от ошибки “() : Не могу получить доступ к файлу ‘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:
Кхм, я такое видел, но редко. Если у вас получается стабильно воспроизвести - это прекрасно! Так эту гадость хотя бы реально поймать.
И может стоит отдельную тему создать, как в своё время для плавающей Ctrl+Z? С ней примерно так же было.
По делу, из информации что стоит добавить - попробуйте заснять на видео, а то на словах тут легко потерять детали.
Ну и на всяк назовите основные характеристики системы. К примеру версию винды, битность, установленные версии .Net Framework…
Минимальный код надо находить не только ради тех, кто будет разбираться в том, что вы нашли. Нахождение минимального кода даёт тот же эффект, что формулирование мысли в виде слов - вы сами начинаете на много лучше понимать о чём думаете. К примеру в данном случае:
uses GraphWPF;
begin
Writeln(RandomPoint(0));
end.
Тут выводит случайную точку. Значит есть 2 варианта:
Проблема воспроизводится на более сложном коде. То есть надо брать исходный код и убирать из него по 1 строчке, пока не перестанет воспроизводится.
Ошибка в логике вашего кода. Спойлер алёрт - в данном случае это правильный вариант.
Ваша проблема в первую очередь в плохом стиле кода. Вы используете пустое значение 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);
Предлагаю обсудить целесообразность расширения ## и ### в конце нулем: ##0 или ###0 …для нумерации срок с 0, чтобы отдельно инструкцию компилятору не писать