Я сильно не пытался но смог убить паскаль сразу 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), такая структура мне удобнее всего так что я предпочту оставить. Пока ставлю заглушки и т.п;
-Я и не сомневаюсь что попадусь на эти ошибки снова, надо хотя бы знать какая у них причина чтоб нормально уворачиваться.
Ошибка с PCU воспроизводится (там сбой при записи). Посмотрим. В оболочке она направляется в dev/null и модуль перекомпилируется каждый раз. Поэтому там все работает.
Второй способ - попытаться проверить переменную типа Segment(использовался is но .<>nil делает то же самое, зато writeln в этом случае работает).
Программу запустил, вроде не вылетело. Нужно на какие-то кнопки нажимать?
3 проблема решена, как я и думал в основном мой косяк(не хватало одного if), но если бы не зависания паскаля я бы и не добавил сюда… В общем вот решение зависаний.
P.S. спустя 8 часов я наконец понял… Не хватало строчки с if из за проблемы №2, она была закоментирована Сейчас она стоит в другом месте, но лучше вернуть где была, потому что сейчас его придётся ставить у каждого наследника Segment отдельно, а раньше он был 1 для всех. В общем кажется надо ещё раз разбирать программу построчно.
@admin можете пожалуйста проверить сначала в какой код на C++ преобразовывается та процедура, чтоб я не делал лишнюю тонну работы?