Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

DNK
I. DNK
Баллы: 5

Подробнее »



Вопрос # 1 773

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
Пишу программку, столкнулся с такой вот проблемой: при использовании процедуры left (y,x,p) // внутри проги, вылетает ошибка [Error] MainMenu.pas(94): Missing operator or semicolon, но при использовании функции right (y,x,p), все компилируется прекрасно, функции эти аналогичны за исключением одного знака (в left сложение переменных, в right вычитание переменных).
Надеюсь на вашу помощь, заранее спасибо!

Приложение:
  1.  
  2.  
  3. procedure left(y: integer; var x: integer; var p: boolean);
  4. begin
  5. if ((x-1)<>0)and(p=false) then
  6. begin
  7. x:=x-1;
  8. Form4.ActionLog.Items.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'&#194;&#251; &#243;&#241;&#239;&#229;&#248;&#237;&#238; &#239;&#240;&#238;&#248;&#235;&#232;');
  9. end
  10. else
  11. if ((x-1)<>0)and(p=true) then
  12. Form4.ActionLog.Items.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'&#194;&#251; &#237;&#224;&#242;&#234;&#237;&#243;&#235;&#232;&#241;&#252; &#237;&#224; &#239;&#240;&#229;&#239;&#255;&#242;&#241;&#242;&#226;&#232;&#229;, &#239;&#240;&#238;&#245;&#238;&#228; &#237;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#229;&#237;')
  13. else
  14. if (x-1=0) then
  15. Form4.ActionLog.Items.Add ('X('+IntToStr(x)+') '+'Y('+IntToStr(y)+') '+'&#205;&#229;&#226;&#238;&#231;&#236;&#238;&#230;&#229;&#237; &#226;&#251;&#245;&#238;&#228; &#231;&#224; &#239;&#240;&#229;&#228;&#229;&#235;&#251; &#234;&#224;&#240;&#242;&#251;');
  16. end;


IlluminatI Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

IlluminatI (статус: 2-ой класс), 17 июля 2008, 14:01 [#2]:

Все проверил, ";" на 93 строке стоит, вот код, идущий до вызова функции:
x:=1;
y:=1;
p:=false;
left(y,x,p);
---------------
ошибка все эта же... ((
min@y™

min@y™ (статус: Доктор наук), 17 июля 2008, 14:06 [#3]:

Ну, блин, чудес-то не бывает.
Выкладывай весь модуль тогда.
Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп!
min@y™

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

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

IlluminatI (статус: 2-ой класс), 17 июля 2008, 14:24 [#6]:

Всем спасибо, все заработало, дело, видимо было, в неправильном названии самой процедуры (стоило с Left поменять на mLeft, как все откомпелировалось)!
Вадим К

Вадим К (статус: Академик), 17 июля 2008, 14:28 [#7]:

в принципе логично. компилятор считал, что left - это свойство формы и вызвать его таким образом крайне накладно:).
А сделали бы методом формы - компилятор сразу бы намекнул, что что-то не так.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 17 августа 2017, 11:01
Выполнено за 0.09 сек.
Рейтинг@Mail.ru