|
Вопрос # 1 773/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Пишу программку, столкнулся с такой вот проблемой: при использовании процедуры left (y,x,p) // внутри проги, вылетает ошибка [Error] MainMenu.pas(94): Missing operator or semicolon, но при использовании функции right (y,x,p), все компилируется прекрасно, функции эти аналогичны за исключением одного знака (в left сложение переменных, в right вычитание переменных).
Надеюсь на вашу помощь, заранее спасибо!
Приложение: Переключить в обычный режим-
-
- procedure left(y: integer; var x: integer; var p: boolean);
- begin
- if ((x-1)<>0)and(p=false) then
- begin
- x:=x-1;
- Form4.ActionLog.Items.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'Âû
óñïåøíî
ïðîøëè');
- end
- else
- if ((x-1)<>0)and(p=true) then
- Form4.ActionLog.Items.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'Âû
íàòêíóëèñü
íà
ïðåïÿòñòâèå,
ïðîõîä
íåâîçìîæåí')
- else
- if (x-1=0) then
- Form4.ActionLog.Items.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+')
'+'Íåâîçìîæåí
âûõîä çà
ïðåäåëû
êàðòû');
- end;
 |
Вопрос задал: IlluminatI (статус: 2-ой класс)
Вопрос отправлен: 17 июля 2008, 12:37
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: min@y™
Что-то мне подсказывает, что перед вызовом left (y,x,p) пропущена точка с запятой в конце предыдущей строки.
Кстати, почему p у тебя как var-параметр? Он же не изменяется в теле процедуры.
Я бы переписал процедуру так, например:
procedure left(const y: integer; const p: boolean; var x: integer);
begin
with Form4.ActionLog.Items do
if x <> 1
then if p
then begin
Dec(x);
Add('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'...');
end
else Add('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'...')
else Add('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'...');
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 17 июля 2008, 13:05
|
Ответ #2. Отвечает эксперт: ANBsoft
Здравствуйте, IlluminatI!
Вообще эта ошибка говорит о том, что Вы пропустили где-то ";".
Какая строка является 94 в проекте, посмотрите предыдущую?
Проверил Ваш код - все компилируется.
Привожу немного модифицированный (заменил компонент ActiveLog на Memo).
procedure left(y: integer; var x: integer; var p: boolean);
begin
if ((x-1)<>0)and(p=false) then begin
x:=x-1;
Form2.Memo1.Lines.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'Au oniaoii i?ioee');
end
else
if ((x-1)<>0)and(p=true) then
Form2.Memo1.Lines.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'Au iaoeioeenu ia i?aiyonoaea, i?ioia iaaicii?ai')
else
if (x-1=0) then
Form2.Memo1.Lines.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'Iaaicii?ai auoia ca i?aaaeu ea?ou');
end;
 |
Ответ отправил: ANBsoft (статус: Студент)
Время отправки: 17 июля 2008, 13:10
|
Мини-форум вопроса
Всего сообщений: 7; последнее сообщение — 17 июля 2008, 14:28; участников в обсуждении: 3.
|
Вадим К (статус: Академик), 17 июля 2008, 13:11 [#1]:
Такую функцию (она обращается к компонентам формы) лучше делать приватным методом формы. Такой подход много проблем решит и поможет многих избежать в будущем.
Например, если Form4 создаётся динамически
Галочка "подтверждения прочтения" - вселенское зло.
|
|
IlluminatI (статус: 2-ой класс), 17 июля 2008, 14:01 [#2]:
Все проверил, ";" на 93 строке стоит, вот код, идущий до вызова функции:
x:=1;
y:=1;
p:=false;
left(y,x,p);
---------------
ошибка все эта же... ((
|
|
min@y™ (статус: Доктор наук), 17 июля 2008, 14:06 [#3]:
Ну, блин, чудес-то не бывает.
Выкладывай весь модуль тогда.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
min@y™ (статус: Доктор наук), 17 июля 2008, 14:09 [#4]:
[b]Missing operator or semicolon[/b]
This error message appears if there is no operator between two subexpressions, or no semicolon between two statements.
Often, a semicolon is missing on the previous line.
program Produce;
var
I: Integer;
begin
I := 1 2 (*<-- Error message here*)
if I = 3 then (*<-- Error message here*)
Writeln('Fine')
end.
The first statement in the example has two errors - a '+' operator and a semicolon are missing. The first error is reported on this statement, the second on the following line.
program Solve;
var
I: Integer;
begin
I := 1 + 2; (*We were missing a '+' operator and a semicolon*)
if I = 3 then
Writeln('Fine')
end.
The solution is to make sure the necessary operators and semicolons are there.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
|
|
IlluminatI (статус: 2-ой класс), 17 июля 2008, 14:19 [#5]:
Вот весь код, ошибка тут появляется:
procedure TForm1.StartClick(Sender: TObject);
begin
Form4.Visible:=true;
Form5.Visible:=true;
Form6.Visible:=true;
Form7.Visible:=true;
x:=1;
y:=1;
p:=false;
left(y,x,p);
end;
саму процедуру Left я уже приводил, без использования процедуры все компилируется нормально.
|
|
IlluminatI (статус: 2-ой класс), 17 июля 2008, 14:24 [#6]:
Всем спасибо, все заработало, дело, видимо было, в неправильном названии самой процедуры (стоило с Left поменять на mLeft, как все откомпелировалось)!
|
|
Вадим К (статус: Академик), 17 июля 2008, 14:28 [#7]:
в принципе логично. компилятор считал, что left - это свойство формы и вызвать его таким образом крайне накладно .
А сделали бы методом формы - компилятор сразу бы намекнул, что что-то не так.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|