Вылеты о которых мы сейчас говорим - исправляются минимальным объёмом тестирования, которое в любом случае требуется перед тем как куда то отправлять.
Кроме того, вылеты на проде это так же свидетельство плохого стиля. В нормальных программах стоит общая обработка исключений для не_безопастных участков кода. Особенно там, где пользователь может потерять данные.
К примеру, компилятор паскаля вместо вылета показывает окно внутренней ошибки.
В то же время глючный результат в больших программах - будет много с чем смешиваться. В итоге получаем багофичи и легаси код у оригинального разработчика, потому что такие моменты всегда проще заставить работать, чем разобраться во всём и исправить.
А в обычных динамических массивах вы как предпочли бы , как сейчас SetLength, или чтобы вызывался конструктор и в нём задавалась длинна? Ведь мы в коде тоже может забыть длину указать.
SetLength - это пережиток. Хотя, бывает полезен, если надо изменить длину, сохранив значения элементов, насколько это возможно. Но если этим планируется часто заниматься, используйте List. А так - конечно же через new.
Данный проект позволяет в несколько строчек кода на Паскале запустить контроллер и подать напряжение на любую ножку. Также поддерживаются таймеры. На выходе получается код Си , который можно запустить, проверить, допустим что светодиод мигает и далее уже писать проект на Си. В перспективе на Паскале можно будет писать и другие части программы. Пока поддерживается только один вид контроллеров, но будут добавлены и другие. Уже даже в такой сырой версии проект может сэкономить значительное время на настройку контроллеров и таймеров.
Для работы надо открыть файлы main.pas и usercode.pas и отредактировать их под конкретную реализацию контроллера.
Особенности/недоделки
Сейчас в программе может быть только одна секция const,var и т.д.
В строке где const нельзя объявлять константу, только на следующей.
Вот полный код программы которую редактирует пользователь
uses usercode;
uses piclibrary in '../API/piclibrary.pas';
begin
Cpu := PIC18F4520; //Модель СPU
Quartz := 8; //Частота кварца в МГц,INTERAL -внутренний.
YesCompile := True; //Компилируем C- программу
RealTime := True; //Такие же времена ,как на контроллере.
SetAsIn(RF);
SetAsIn(RA+2); //Установить порт RA2 как входной.
SetAsIn(RA+5);
//SetTimer(1,9,nil);
InitCPU;
SetTimer(1,5000000,OnTimer1);
SetTimer(2,3000*Millisecond,OnTimer2);
Run(Start);
end.
unit usercode;
interface
uses piclibrary in '../API/piclibrary.pas';
const
LED_RED = RC + 0;
LED_GRN = RC + 1;
var
RedState : byte;
GreenState : byte;
procedure Start;
procedure OnTimer1;
procedure OnTimer2;
implementation
procedure Start;
begin
RedState := 0;
GreenState := 0;
end;
procedure OnTimer1;
begin
SetBit(LED_RED,RedState);
RedState := RedState xor 1;
end;
procedure OnTimer2;
begin
SetBit(LED_GRN,GreenState);
GreenState := GreenState xor 1;
end;
begin
end.
При программировании на Си код получается гораздо длиннее. Кроме того настройка тех же таймеров достаточно хлопотное занятие.
Вопрос не праздный. Разработчики продвигают PascalАВС,NЕТ вместе с современными технологиями программиирования, в частности, с отказом от секции описания переменных в пользу внутриблочных описаний. В этом свете Ваш проект - шаг назад.
Ну да для вас всё шаг назад , что хоть как-то может вывести проект по применению за пределы вашей маленькой микросекты. Лучше 100500 бесполезных наворотов сделать и хвастаться друг перед другом о том, что за крутые навороты мы сделали.
В общем я понял свой следующий шаг , перевести проект на нормальный Delphi , тогда может кому и пригодится.
К локальным переменным это отношения не имеет, но вообще лучше использовать статичные поля классов, вместо глобальных переменных. Чтоб всё было по полочкам разложено, а не в 1 куче.
В паскале не принято делать по файлу на каждый класс/группу классов. И поэтому в 1 модуле часто сталкиваются несколько наборов функционала.
Если не сувать глобальные переменные прямо внутрь классов, которые с ними больше всего связаны - получается свалка среди глобальных имён.
А вы всё думаете что у меня много опыта в C#? Весь мой опыт в нём это пара приватных проектов + ваш компилятор. Остальное опыт что релевантен здесь - это опыт в паскале, .Net в целом и частицы из вообще других языков.
Модуль в паскале можно рассматривать как статический класс.
С этой точки зрения в статическом классе тоже можно наплодить много полей.
В классах не всегда выполняется принцип единственной обязанности, поэтому возможны наборы переменных, отвечающие за разное.
Поэтому можно говорить лишь о рекомендациях не использовать значительное количество разнородных глобальных переменных - и особенно тех, которые имеют ограниченное время жизни - скажем, в цикле.
Стив Макконнел. “Совершенный код”. Первое, что в руки попалось, потому что только ленивый не пишет, что глобальные переменные - это плохо, если язык позволяет их не использовать.