| 
| 
 | Вопрос # 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 - это свойство формы и вызвать его таким образом крайне накладно  . А сделали бы методом формы - компилятор сразу бы намекнул, что что-то не так.
 Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |