итак, поехали.
в компиляторе стелса (как и в компиляторе паскаля) существует 2 типа "ошибок" (неправильный термин, но все же).
а) Error - "Compiler: [Error]" - это критическая ошибка, скрипт не будет выполняться до тех пор пока ошибка не будет устранена. основные причины описаны ниже.
б) Hint - "Compiler: [Hint]" - напоминание, подсказка
например
22:03:47 Compiler: [Hint] (11.sc at 4:1): Variable 'DT' never used
появляется по причине того, что в переменных dt объявлено
Code: Select all
var
dt:TDateTime;
как правило(НЕ ВСЕГДА!), можно удалять.
другой пример:
23:01:04 Compiler: [Hint] (11.sc at 7:10): Variable 'Result' never used
почему это появляется?
пример:
Code: Select all
Program New;
function fgfg (a : Word) : String;
begin
//тут что-то делается
Result := ??? (что-то);
end;
BEGIN //Main begin
...
fgfg(12);
итак, в данном случае мы имеем вызов функции, которая возвращает значение String - но оно никому не нужно - банально не используется. это не критическая ошибка, скрипт выполнится - но все же так делать не стоит.function SomeFunction (xxx : varType) : SomeType;
begin
///что-то тут делается, вычисляется, неважно.
Result := какое-то_значение (зависит от типа);
end;
означает, что функция вернет значение, которое записано в Result.
procedure SomeFunction (xxx : varType);
begin
///что-то тут делается, вычисляется, неважно.
end;
НИЧЕГО не возвращает. вообще. если попробовать присвоить Result что-то - выругается.
так что если в двух словах - function возвращает значение, procedure - нет.
в данном примере правильно было бы:
Code: Select all
Program New;
procedure fgfg (a : Word);
begin
//тут что-то делается
end;
BEGIN //Main begin
...
fgfg(12);
1) Unknown identifier 'хххх' - неправильно написанное название функции\процедуры либо служебного идентификатора (например findTyp вместо findType или beg in вместо begin)
2) Identifier expected 'хххх' незаконченная предыдущая строка (либо наоборот, преждевременно законченое выражение), а ошибку соответственно показывает на следующей строке.
например
Code: Select all
if X > 1 then
begin
...
end;
else // <== ошибка приведет сюда, не на end; !!!!
..
возможны вариации, но общая суть примерна такова.
3) Out Of Range
одна из любимых юзверями ошибок - потому что не ведет в конкретное место, а просто выдается и все.
ошибка выхода за диапазон.
причина возникновения:
обращение к ячейке массива, которая находится вне объявленного диапазона.
пример:
Code: Select all
var
a : array [0..1] of Word;
...
begin
a[2] := 3;
4) List index out of bounds
тоже горячо любимый пользователями error:
Code: Select all
var
a : TStringList;
...
begin
a := TStringList.Create;
UOSay('buy');
a := GetShopList;
//да, предполагается, что наш стринглист заполнился.
// да, опытный скриптер поставит проверку типа if a.Count > 0 then...
// а неопытный (в случае если что-то не сработало и стринглист НЕ заполнится) - получит при обращении, например к a.Strings[1] красивую ошибку
[quote]Exception: List index out of bounds (2) at 0.85[/quote]
// ну пустой этот стринглист, пустой. нет у него даже нулевой строки, не говоря уж за третью...
a.Free;
5) Type mismatch
несовпадение типов:
1) самое банальное - сравнивать разные типы, например String сравнивать с Word.
a : String;
b : Word;
....
if a <> b then // а вот и ошибка - ведь типы совсем разные.
2) if X=0 and Y = 0 then //и тут ошибка. почему?
а все потому, что в условиях ОБЯЗАТЕЛЬНО надо разные условиях ограждать скобками.
в данном случае
if( X=0) and (Y = 0) then //ошибки не вызовет.
if ( (X = 0) and (Y = 0) ) or ( (Z = 0) and ( not (W = 0)) ) then //правильно
Кстати, одно условие можно скобками не ограждать -
if X=0 then
не будет ошибкой, а очень даже нормально выполнится.
6) Semicolon (';') expected
Пример
В 99 процентах случаев это значит, что в конце предущей строки отсутствует точка с запятой. просто поставить и все.Compiler: [Error] (Taming.sc at 19:1): Semicolon (';') expected