Приветствую! В данной статье мы рассмотрим типичную проблему, с которой могут столкнуться разработчики при работе с FreePascal – ошибки компиляции. Мы шаг за шагом разберемся с примером, который вы, вероятно, встречали в учебных материалах по Object Pascal и Delphi.
Описание проблемы
Пользователь столкнулся с ошибками компиляции в программе на FreePascal, предназначенной для расчета штрафов за нарушения правил дорожного движения. Код, представленный в вопросе, содержит несколько критических ошибок, в том числе синтаксические, которые приводят к остановке компиляции. Ошибка начинается с линейки 39 и связана с неверным использованием конструкции on.
Контекст вопроса
Вот исходный код программы, который вызывает ошибки:
program TrafficFine;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,SysUtils;
var
userInput : Char;
Fine : Integer;
TotalFine : Integer;
DaysPassed: Integer;
FineType : Integer;
begin
userInput := 'y';
while (userInput = 'Y') or (userInput = 'y') do
begin
writeln('Enter type of fine:');
// ...
try
write('Enter value: ');
readln(FineType);
if(FineType < 0) or (FineType > 3) then
raise exception.Create('Fine type outside of range.');
case FineType of
1: Fine:= 500;
2: Fine:= 1000;
3: Fine:= 2000;
// Ошибка: конструкция case не закрыта
except
on e: exception do begin
Writeln('Error: '+e.Message);
continue;
end;
// ...
end.
// ...
end.
Анализ ошибок
Ошибки компиляции связаны с неправильным использованием конструкций case и except. В частности, в коде отсутствуют необходимые директивы end для закрытия блоков case и цикла begin...end.
Подтвержденный ответ
Для исправления ошибок в вашем коде необходимо добавить закрывающие директивы end для блоков case и цикла:
program TrafficFine;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes,SysUtils;
var
userInput : Char;
Fine : Integer;
TotalFine : Integer;
DaysPassed: Integer;
FineType : Integer;
begin
userInput := 'y';
while (userInput = 'Y') or (userInput = 'y') do
begin
writeln('Enter type of fine:');
// ...
try
write('Enter value: ');
readln(FineType);
if(FineType < 0) or (FineType > 3) then
raise exception.Create('Fine type outside of range.');
case FineType of
1: Fine:= 500;
2: Fine:= 1000;
3: Fine:= 2000;
end; // Добавили end для закрытия блока case
except
on E: Exception do begin
Writeln('Error: '+E.Message);
continue;
end;
end; // Добавили end для закрытия блока try
// ...
end; // Добавили end для закрытия цикла
// ...
end.
Альтернативный ответ
В дополнение к исправлению ошибок, вы можете также добавить проверку корректности ввода пользователя на предмет чисел. Например, использовать функцию TryStrToInt из SysUtils для преобразования введенной строки в целое число и обработку возможных ошибок.
Выводы
В процессе разработки программ на FreePascal важно внимательно следить за синтаксисом языка. Небольшие ошибки, такие как пропущенные директивы end, могут привести к серьезным проблемам на этапе компиляции. Использование правил форматирования кода и регулярные ревью могут помочь избежать подобных ошибок.
Надеемся, что данная статья помогла вам устранить ошибки в вашем коде и вы сможете продолжить разработку программы для расчета штрафов. Удачи в изучении Object Pascal и Delphi!
Помощь в устранении синтаксических ошибок компиляции программы на FreePascal для расчета штрафов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS