3 способа сломать паскаль

Я сильно не пытался но смог убить паскаль сразу 3 способами, и во всех совершенно не понимаю что сделал не так…

И так, первый способ - нажать ПКМ на .pas файле основной программы GA.pas(GA.rar (129,7 КБ) ) и выбрать “Компилировать”: Из редактора работает.

Второй способ - попытаться проверить переменную типа Segment(использовался is но .<>nil делает то же самое, зато writeln в этом случае работает). Закомментированая строчка находится в файле REData.pas, в методе Dangeon.WaitRoomsCreation на строчке 251:

Ошибка времени выполнения: System.InvalidProgramException: Среда выполнения Common Language Runtime обнаружила недопустимую программу. Стек: в REData.Dangeon.WaitRoomsCreation() в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) в System.Threading.ThreadHelper.ThreadStart()

И последний - попытаться получить значение переменной ConnectionT В файле RData.pas в конструкторе типа Hall на строчке 213 находится код: writeln('Log.txt',C); Поток зависает на ней, когда writeln доходит до C, но он успевает написать 'Log.txt' в консоль(а ещё почему то при этом ломается курсор, у него должен быть белый круг в центре, но он становится весь чёрный). Так же если закомментировать те writeln - выдаст исключение System.NullReferenceException(оно сопровождается характерным пиканьем и созданием файла Errors.txt' с данными об ошибке).

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

Скопировал модули RData и REData в отдельный test.pas (3,8 КБ) и удалил строчки не относящиеся к делу, протестировал несколькими способами, максимально приближая условия к основной программе, на третью ошибку - всё работает адекватно… Или это ужасно глубокая ошибка, которой будет даже важно написан код в модуле или основной программе или что то вроде того, в чём сложно отследить логическую зависимость… Или я посчитал какую то нужную строчку ненужной и удалил… Буду дальше тестировать, но всё же большая просьба к тем кто читает это - протестировать у себя…

– Доктор, когда я делаю вот так, мне больно… – Голубчик, а Вы “вот так” больше не делайте!

Это конечно приятно, когда получается случайно поменять код так что ошибка исчезает и получается просто забыть, но есть 3 проблемы: -В паскале останется ошибка… Ошибка=плохо ;); -Мне не слабо перепродумать и переделать структуру программы(особенно с пунктом 3), такая структура мне удобнее всего так что я предпочту оставить. Пока ставлю заглушки и т.п; -Я и не сомневаюсь что попадусь на эти ошибки снова, надо хотя бы знать какая у них причина чтоб нормально уворачиваться.

Ничего не понял. Пример test работает. Пришлите минимальный неработающий

Ошибка с PCU воспроизводится (там сбой при записи). Посмотрим. В оболочке она направляется в dev/null и модуль перекомпилируется каждый раз. Поэтому там все работает.

Второй способ - попытаться проверить переменную типа Segment(использовался is но .<>nil делает то же самое, зато writeln в этом случае работает).

Программу запустил, вроде не вылетело. Нужно на какие-то кнопки нажимать?

а да, нажал “Играть” и упало

1 лайк

3 проблема решена, как я и думал в основном мой косяк(не хватало одного if), но если бы не зависания паскаля я бы и не добавил сюда… В общем вот решение зависаний.

P.S. спустя 8 часов я наконец понял… Не хватало строчки с if из за проблемы №2, она была закоментирована :wink: Сейчас она стоит в другом месте, но лучше вернуть где была, потому что сейчас его придётся ставить у каждого наследника Segment отдельно, а раньше он был 1 для всех. В общем кажется надо ещё раз разбирать программу построчно. @admin можете пожалуйста проверить сначала в какой код на C++ преобразовывается та процедура, чтоб я не делал лишнюю тонну работы?

1 лайк

Не, точно не проверю

Баг с continue пофиксил на githube.

1 лайк