1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
program proverki ; type point = record x , y : integer ; end; var a : array [1..30] of point ; i , j , n , m : integer ; xa1, xa2, xa3, xa4, xa5, ya1, ya2, ya3, ya4, ya5, sc1, sc2, sc3, sc4, sc5, sc6 : integer ; dlin1 , dlin2 , dlin3 , dlin4 , dlin5: real ; cosFi1 , cosFi11 , cosFi12 , cosFi2 , cosFi21 , cosFi22 , fi1 , fi11 , fi12 , fi2 , fi21 , fi22 , s1 , s2 ,p1,p2: real ; left, sv:boolean; fi:real; begin writeln('vvedite kolichestvo vershin'); readln(n); writeln('vvedite koordinaty'); for i:=1 to n do readln(a[i].x,a[i].y); i:=1; j:=i+3; xa1 := a[i+2].x - a[i].x; ya1 := a[i+2].y - a[i].y; xa2 := a[j].x - a[i].x; ya2 := a[j].y - a[i].y; xa3 := a[i+1].x - a[i].x; ya3 := a[i+1].y - a[i].y; xa4 := a[i+2].x - a[i+1].x; ya4 := a[i+2].y - a[i+1].y; xa5 := a[j].x - a[i+1].x; ya5 := a[j].y - a[i+1].y; dlin1 := sqrt(sqr(xa1)+sqr(ya1)); dlin2 := sqrt(sqr(xa2)+sqr(ya2)); dlin3 := sqrt(sqr(xa3)+sqr(ya3)); dlin4 := sqrt(sqr(xa4)+sqr(ya4)); dlin5 := sqrt(sqr(xa5)+sqr(ya5)); sc1 := xa1 * xa3 + ya1 * ya3 ; sc2 := xa1 * xa2 + ya1 * ya2 ; sc3 := xa2 * xa3 + ya2 * ya3 ; sc4 := xa3 * xa4 + ya3 * ya4 ; sc5 := xa3 * xa5 + ya3 * ya5 ; sc6 := xa4 * xa5 + ya4 * ya5 ; cosFi1 := sc1/(dlin1*dlin3); cosFi11 := sc2/(dlin1*dlin2); cosFi12 := sc3/(dlin2*dlin3); cosFi2 := sc4/(dlin3*dlin4); cosFi21 := sc5/(dlin3*dlin5); cosFi22 := sc6/(dlin4*dlin5); fi1 := arctan(sqrt(1-cosFi1*cosFi1)/cosFi1); fi11 := arctan(sqrt(1-cosFi11*cosFi11)/cosFi11); fi12 := arctan(sqrt(1-cosFi12*cosFi12)/cosFi12); fi:= fi11+fi12; fi2 := arctan(sqrt(1-cosFi2*cosFi2)/cosFi2); fi21 := arctan(sqrt(1-cosFi21*cosFi21)/cosFi21); fi22 := arctan(sqrt(1-cosFi22*cosFi22)/cosFi22); s1:=dlin1*dlin3*sin(fi1); s2:=dlin1*dlin2*sin(fi2); p1:=dlin1*dlin3*s1*cosFi1*sin(fi1); p2:=dlin1*dlin2*s2*cosFi2*sin(fi2); writeln; if p1>0 then left:=true else left:=false; if fi1:=fi11+fi12 and fi2:=fi21+fi22 then sv:=false else sv:=true;//-----в этой строке ругается. что не правильно? end. |
СООБЩЕНИЯ КОМПИЛЯТОРА ОБ ОШИБКАХ
§ Если в меню Options?Linker?Link Buffer, установлен параметр Memory, переключите его в значение Disk.
§ Возможно программа слишком велика, чтобы компилироваться в таком объеме памяти. Следует разбить ее на два или более модуля.
§ несоответствующее количество begin и end (не забудьте, что оператор case также заканчивается словом end);
§ включаемый файл заканчивается в середине раздела операторов. Каждый раздел операторов должен целиком помещаться в одном файле;
§ незаконченный комментарий.
§ несовместимые типы переменной и выражения в операторе присваивания;
§ несовместимые типы фактического и формального параметров в обращении к процедуре или функции;
§ тип выражения, несовместимый с типом индекса при индексировании массива;
§ несовместимые типы операндов в выражении.
§ Идентификатору функции можно присваивать значения только внутри раздела операторов данной функции.
§ Объектный файл .obj определяет идентификаторы PUBLIC, которые не находятся в сегменте CODE.
§ Идентификатор обозначает абсолютную переменную.
§ Идентификатор обозначает процедуру или функцию типа inline.
§ Файл .com содержит ссылки с размерами в байтах на перемещаемые идентификаторы. Такая ошибка происходит в случае, если вы используете операторы HIGH и DOWN с перемещаемыми идентификаторами или если вы ссылаетесь в директивах DB на перемещаемые идентификаторы.
§ Операнд ссылается на перемещаемый идентификатор, который не был определен в сегменте CODE или в сегменте DATA.
§ Операнд ссылается на процедуру EXTRN или функцию EXTRN со смещением, например CALL SortProc+8.
§ Процедуры или функции были описаны с помощью описания forward, но их определение не найдено.
§ Вы пытаетесь осуществить приведение типа выражения, когда разрешается только ссылка на переменную, процедуру или функцию.
§ Вы пытаетесь присвоить константу вне диапазона переменной.
§ Вы пытаетесь передать константу вне диапазона в качестве параметра процедуре или функции.
Размер локальных переменных, описанных в программе или функции, не может превышать 64 Кбайт.
Не баг, а фича («неверные» результаты арифметических выражений в Pascal)
Только что объяснял человеку, вот и запишу по горячим следам. Начинающие «паскалисты» нередко не понимают строгой типизированности этого языка, из-за чего находят в нём несуществующие «баги». Вот простейший пример.
var a,b:integer;
r:longint;
begin
a:=1000;
b:=200;
r:=a*b;
writeln (r);
end.
Эта программа выдаст отнюдь не 200000, как может показаться. Ответ будет равен 3392 (результат переполнения). Никакого бага нет. Тип выражения в Паскале определяется только типом входящих в него переменных, но не типом переменной, куда записывается результат. То есть, мы вычислили с переполнением произведение двух переменных типа Integer, а потом «испорченный» результат переписали в переменную типа Longint. Ничего не изменит и
r:=Longint(a*b);
Здесь тоже сначала вычислен результат с переполнением, затем преобразован к типу Longint. А вот
r:=Longint(a)*b;
рулит, получите свои 200000 🙂 Указанная ошибка часто встречается в программах начинающих. Чтобы её не повторять, помните — выражение в Паскале должно быть приведено к нужному типу в процессе его вычисления, а не после его окончания или при присваивании.
P.S. В ряде компиляторов, как во Free Pascal, ошибка не всплывёт, но это не значит, что её не нужно учитывать
02.02.2010, 15:34 [10021 просмотр]
К этой статье пока нет комментариев, Ваш будет первым
It stops compiling at lines 54 and 58 with errors ‘Error: Illegal expression’ and ‘Syntax error, ; expected but ELSE found’ respectively. Is my position of the lines wrong?
Procedure PlayDiceGame(PlayerOneName, PlayerTwoName : String;
VirtualDiceGame : Boolean; Var TopScores : TTopScores);
Var
PlayerOut : Boolean;
CurrentPlayerScore : Integer;
AppealDieResult : Integer;
PlayerNo : Integer;
PlayerOneScore : Integer;
PlayerTwoScore : Integer;
BowlDieResult : Integer;
RunsScored : Integer;
NumberOfBalls : Integer;
Begin
For PlayerNo := 1 To 2
Do
Begin
NumberOfBalls := 0;
CurrentPlayerScore := 0;
PlayerOut := False;
If PlayerNo = 1
Then Writeln(PlayerOneName, ' is batting')
Else Writeln(PlayerTwoName, ' is batting');
Writeln;
Writeln('Press the Enter key to continue');
Readln;
Repeat
BowlDieResult := RollBowlDie(VirtualDiceGame);
If BowlDieResult In [1..4]
Then
Begin
RunsScored := CalculateRunsScored(BowlDieResult);
DisplayRunsScored(RunsScored);
CurrentPlayerScore := CurrentPlayerScore + RunsScored;
Writeln('Your new score is: ', CurrentPlayerScore);
End;
If BowlDieResult = 5
Then Writeln('No runs scored this time. Your score is still: ',
CurrentPlayerScore);
If BowlDieResult = 6
Then
Begin
Writeln('This could be out... press the Enter key to find out.');
Readln;
AppealDieResult := RollAppealDie(VirtualDiceGame);
DisplayAppealDieResult(AppealDieResult);
If AppealDieResult >= 2
Then PlayerOut := True
Else PlayerOut := False;
End;
Writeln;
Writeln('Press the Enter key to continue');
Readln;
NumberOfBalls = NumberOfBalls + 1
Until PlayerOut or (NumberOfBalls = 6);
If (NumberOfBalls = 6) Then
Writeln('You have faced 6 balls and compeletd your innings');
Writeln('Your final scoare was: ', CurrentPlayerScore);
Else
Writeln('You are out. Your final score was: ', CurrentPlayerScore);
Writeln;
Writeln('Press the Enter key to continue');
Readln;
If PlayerNo = 1
Then PlayerOneScore := CurrentPlayerScore
Else PlayerTwoScore := CurrentPlayerScore;
End;
DisplayResult(PlayerOneName, PlayerOneScore, PlayerTwoName, PlayerTwoScore);
If (PlayerOneScore >= PlayerTwoScore)
Then
Begin
UpdateTopScores(TopScores, PlayerOneName, PlayerOneScore);
UpdateTopScores(TopScores, PlayerTwoName, PlayerTwoScore);
End
Else
Begin
UpdateTopScores(TopScores, PlayerTwoName, PlayerTwoScore);
UpdateTopScores(TopScores, PlayerOneName, PlayerOneScore);
End;
Writeln;
Writeln('Press the Enter key to continue');
Readln;
End;