Иногда, изучая новые языки программирования, такие как Free Pascal, начинающие разработчики сталкиваются с различными ошибками компиляции. Одной из распространенных проблем является ошибка "Undefined symbol", которая может возникать по разным причинам. В данной статье мы рассмотрим проблему, связанную с неопределенными символами THREADVARLIST_STRINGS и STRINGS_STRPAS$PCHAR$$SHORTSTRING, и найдем решение, применимое к базовой программе на массивы.
Описание проблемы
Разработчик столкнулся с двумя ошибками компиляции при попытке скомпилировать простую программу на языке Pascal с использованием Free Pascal:
Strings.lpr(32,1) Error: Undefined symbol: THREADVARLIST_STRINGS
Strings.lpr(32,1) Error: Undefined symbol: STRINGS_STRPAS$PCHAR$$SHORTSTRING
Strings.lpr(32,1) Fatal: There were 2 errors compiling module, stopping
Код программы следующий:
program Strings;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils
{ you can add units after this };
{$R *.res}
var
Marks : array [1..10] of Integer;
index : Integer;
begin
for index:= 0 to 10 do
begin
write('Enter mark of student ',index,': ');
readln(marks[index]);
end;
for index := 0 to 10 do
begin
write('Student No. ',index,' Marks: ',marks[index],' ');
if marks[index] > 65 then writeln('PASS')
else writeln('FAIL');
end;
writeln('Press any key to continue.');
readln;
end.
Анализ проблемы
Проблема заключается в том, что имя программы Strings совпадает с именем встроенной единицы (unit), что приводит к конфликту имен. В Free Pascal, как и во многих других компиляторах, существуют определенные имена, зарезервированные под внутренние библиотеки и единицы.
Подтвержденное решение
Избегайте использования зарезервированных имен для своих программ. В данном случае, переименование программы решит проблему:
program TestStrings;
Альтернативное решение
Также, в коде присутствует индексация массива, начиная с нуля, что является ошибкой, так как индексация массива в Pascal начинается с единицы. Кроме того, в коде есть запрос на нажатие любой клавиши для продолжения, который ожидает возврата каретки. Для корректной работы программы следует использовать следующий подход:
program TestStrings;
uses
Classes, SysUtils;
var
Marks : array [1..10] of Integer;
index : Integer;
begin
for index := 1 to 10 do // Исправлено на 1
begin
write('Enter mark of student ', index, ': ');
readln(Marks[index]); // Исправлено на Marks с большой буквы
end;
for index := 1 to 10 do // Исправлено на 1
begin
write('Student No. ', index, ' Marks: ', Marks[index], ' ');
if Marks[index] > 65 then
writeln('PASS')
else
writeln('FAIL');
end;
writeln('Press any key to exit.');
repeat
keypressed := false;
until keypressed; // Добавлено для ожидания нажатия клавиши
end.
Для ожидания нажатия клавиши можно использовать следующий код, который будет ожидать освобождения буфера ввода:
while not KeyPressed do
Sleep(100);
Однако, стоит отметить, что функция KeyPressed и Sleep не являются частью стандартной библиотеки Pascal, и для их использования потребуется подключение дополнительных модулей или библиотек.
Вывод
При работе с Free Pascal важно следить за именами программ, чтобы избежать конфликтов с зарезервированными именами. Также важно правильно индексировать массивы и корректно обрабатывать ввод-вывод данных. Следование этим рекомендациям поможет избежать многих распространенных ошибок при компиляции программ на Free Pascal.
Разработчик столкнулся с ошибками компиляции в Free Pascal из-за конфликта имен и неопределенных символов, которые были устранены путем переименования программы и исправления ошибок в коде.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS