Проекты на PascalABC.NET

Вылеты о которых мы сейчас говорим - исправляются минимальным объёмом тестирования, которое в любом случае требуется перед тем как куда то отправлять.

Кроме того, вылеты на проде это так же свидетельство плохого стиля. В нормальных программах стоит общая обработка исключений для не_безопастных участков кода. Особенно там, где пользователь может потерять данные.
К примеру, компилятор паскаля вместо вылета показывает окно внутренней ошибки.

В то же время глючный результат в больших программах - будет много с чем смешиваться. В итоге получаем багофичи и легаси код у оригинального разработчика, потому что такие моменты всегда проще заставить работать, чем разобраться во всём и исправить.

А в обычных динамических массивах вы как предпочли бы , как сейчас SetLength, или чтобы вызывался конструктор и в нём задавалась длинна? Ведь мы в коде тоже может забыть длину указать.

Как сейчас - я уже сказал, SetLength плохо использовать всюду, правильно таки через new. К примеру new byte[123].

Это как?

Объявить динамический массив , а потом указать, A[100] := 1, хотя мы нигде длину не задавали.

Ну дык опять NullReferenceException, ловящееся минимальным тестированием кода.

А вообще нечего разделять объявление и инициализацию. Объявляйте так:

var a := new byte[123];

SetLength - это пережиток. Хотя, бывает полезен, если надо изменить длину, сохранив значения элементов, насколько это возможно. Но если этим планируется часто заниматься, используйте List. А так - конечно же через new.

1 лайк

Таки сделал набросок проекта о котором говорил ранее в соседней теме - преобразует программу Паскаль в код на Си.

Вот ссылка на проект

Данный проект позволяет в несколько строчек кода на Паскале запустить контроллер и подать напряжение на любую ножку. Также поддерживаются таймеры. На выходе получается код Си , который можно запустить, проверить, допустим что светодиод мигает и далее уже писать проект на Си. В перспективе на Паскале можно будет писать и другие части программы. Пока поддерживается только один вид контроллеров, но будут добавлены и другие. Уже даже в такой сырой версии проект может сэкономить значительное время на настройку контроллеров и таймеров.

Для работы надо открыть файлы 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.

При программировании на Си код получается гораздо длиннее. Кроме того настройка тех же таймеров достаточно хлопотное занятие.

1 лайк

А для чего секция var в PascalАВС.NЕТ? Да и const заодно? Для любителей турбопаскалей?

Ну без этой секции транслятор писать было бы подольше. А так в будущем возможно можно будет во всех местах переменные ставить.

Пока просто копипастнул этот кусок кода из другого своего проекта на Дельфи, с интерпретатором книг-игр.

Вопрос не праздный. Разработчики продвигают PascalАВС,NЕТ вместе с современными технологиями программиирования, в частности, с отказом от секции описания переменных в пользу внутриблочных описаний. В этом свете Ваш проект - шаг назад.

1 лайк

Ну да для вас всё шаг назад , что хоть как-то может вывести проект по применению за пределы вашей маленькой микросекты. Лучше 100500 бесполезных наворотов сделать и хвастаться друг перед другом о том, что за крутые навороты мы сделали.

В общем я понял свой следующий шаг , перевести проект на нормальный Delphi , тогда может кому и пригодится.

Золотые слова! Переводите! Оставьте PascalABC.NET ненормальным микросектантам.

2 лайка

Непонятно. В модулях глобальные переменные вполне нормальны. И вообще мы не запрещаем глобальные - упаси боже. Мы проповедуем принцип локальности.

К локальным переменным это отношения не имеет, но вообще лучше использовать статичные поля классов, вместо глобальных переменных. Чтоб всё было по полочкам разложено, а не в 1 куче.

Это в C#.

В Object Pascal эту цель выполняют модули. Основная программа с минимумом глобальных переменных - такой же модуль.

Так что здесь ваш опыт не срабатывает

Нет, тут как раз наоборот, из за отличий от C#.

В паскале не принято делать по файлу на каждый класс/группу классов. И поэтому в 1 модуле часто сталкиваются несколько наборов функционала.

Если не сувать глобальные переменные прямо внутрь классов, которые с ними больше всего связаны - получается свалка среди глобальных имён.

А вы всё думаете что у меня много опыта в C#? Весь мой опыт в нём это пара приватных проектов + ваш компилятор. Остальное опыт что релевантен здесь - это опыт в паскале, .Net в целом и частицы из вообще других языков.

А где написано про запрет? “…с отказом от секции описания переменных в пользу внутриблочных описаний” - это не запрет, а рекомендация.

Модуль в паскале можно рассматривать как статический класс.

С этой точки зрения в статическом классе тоже можно наплодить много полей.

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

Поэтому можно говорить лишь о рекомендациях не использовать значительное количество разнородных глобальных переменных - и особенно тех, которые имеют ограниченное время жизни - скажем, в цикле.

Стив Макконнел. “Совершенный код”. Первое, что в руки попалось, потому что только ленивый не пишет, что глобальные переменные - это плохо, если язык позволяет их не использовать.

1 лайк

Спор уже давно решён. Господа, не будьте дураками - читайте умные книги.