"Этажерка" Begin End ..

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

"Этажерка" Begin End ..

Сообщение Alex2013 » 25.03.2016 00:22:39

Лазарус 1.4.2
Столкнулся с тем, что после не очень определенного количества вложенных блоков Begin end программа начинает работать нестабильно ...
Это что глюк оптимизации ? (да знаю что "моструозные" конструкции моветон ... и в конце концов все же от них избавился ... но САМ ФАКТ неприятно удивил :idea: ...вроде уже с версий 0.9ххх ничего подобного не наблюдалось ... хотя до сих пор старюсь, например, не писать сложных условий через логические операции ..)
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Этажерка" Begin End ..

Сообщение скалогрыз » 25.03.2016 00:34:37

нужен конкретный пример, причём в bug tracker-е
иначе можно только посочувствовать!
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: "Этажерка" Begin End ..

Сообщение Alex2013 » 25.03.2016 00:51:50

скалогрыз писал(а):нужен конкретный пример, причём в bug tracker-е
иначе можно только посочувствовать!

Просто интересно кто-то с чем-то подобным сталкивался ?
(Пример ... возможно на досуге попытаюсь воспроизвести... но повторяю в программе проблема решена ... хотя и через "старый добрый" goto... :mrgreen: )
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Этажерка" Begin End ..

Сообщение sign » 25.03.2016 09:35:54

Alex2013 писал(а):осле не очень определенного количества вложенных блоков Begin end программа начинает работать нестабильно

Лучше бы написали, после сколько конкретного количества блоков наступает нестабильность.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: "Этажерка" Begin End ..

Сообщение zub » 25.03.2016 12:11:30

Подобные баги всегда оказываются багами програмиста-программы.
Без кода воспроизведения "работать нестабильно" нет никакого смысла создавать такие темы

>>но повторяю в программе проблема решена ... хотя и через "старый добрый" goto...
да уж...
zub
долгожитель
 
Сообщения: 2887
Зарегистрирован: 14.11.2005 23:51:26

Re: "Этажерка" Begin End ..

Сообщение SSerge » 25.03.2016 12:15:38

...точка с запятой (всего лишь!) после end перед else - и вся логика катится к чертям. И, что характерно, программер имеющий слабую практику в паскале, хрен найдет такое.
SSerge
энтузиаст
 
Сообщения: 971
Зарегистрирован: 12.01.2012 05:34:14
Откуда: Барнаул

Re: "Этажерка" Begin End ..

Сообщение alexs » 25.03.2016 12:28:08

Alex2013 писал(а):Столкнулся с тем, что после не очень определенного количества вложенных блоков Begin end программа начинает работать нестабильно ...


200% ошибка в коде. Скорее всего не верно if then else расписаны, либо точка с запятой не там стоят.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: "Этажерка" Begin End ..

Сообщение Лекс Айрин » 25.03.2016 12:31:23

alexs, кстати, если использовать неполный if, то нестабильность возникнет быстрее. Именно поэтому я взял за правило использовать только полную форму.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: "Этажерка" Begin End ..

Сообщение svk12 » 25.03.2016 19:55:24

SSerge писал(а):...точка с запятой (всего лишь!) после end перед else - и вся логика катится к чертям.


Компилятор не пропустит.
Код:
Код: Выделить всё
...
end ;else
begin     
...

Сообщение:
Fatal: Syntax error, ";" expected but "ELSE" found
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: "Этажерка" Begin End ..

Сообщение Лекс Айрин » 25.03.2016 20:00:56

svk12 писал(а):Компилятор не пропустит.


Я бы не был так уверен... у меня была ситуация, когда ставь или не ставь ";" компилятор ругался.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: "Этажерка" Begin End ..

Сообщение svk12 » 25.03.2016 20:08:59

Да, на компилятор надейся, но и сам не плошай.
svk12
постоялец
 
Сообщения: 408
Зарегистрирован: 09.06.2008 18:42:47

Re: "Этажерка" Begin End ..

Сообщение alexs » 25.03.2016 21:17:20

Код: Выделить всё
begin
  if 1=1 then
    writeln(1)
  else;
  begin
    writeln(2);
  end
end.


А если вот так?

Добавлено спустя 57 секунд:
Или, что ещё лучше:

Код: Выделить всё
begin
  if 1=1 then  writeln(1) else;
  begin  writeln(2);  end
end.


Хотя за такой стиль написания - руки отрываю сразу...
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4064
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: "Этажерка" Begin End ..

Сообщение Alex2013 » 26.03.2016 01:45:52

Кстати, это все тоже "загадочное место " где я вынужден два раз вызвать скрипт .
Это то что есть сейчас ...
Условие где ранее заметил глюк выделил цветом ...
Код: Выделить всё
//Реакция на нажатие кнопнок мыши
// на рабочие поле
//.......................................
//.......................................

procedure TRF1.Panel2MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
Var
   Ind:Longint;
   SCR:String;
   label L1;
begin
//ClipArt ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
if  ( ClipArtNam <>'') then begin

Case  Button of
mbRight : if  CFA=0 then
begin
  InsertClipArt(X,Y);
  ClipArtNam := '';
  CFa:=1;
  PaintBox1Paint(Sender);
end;

mbLeft : if  CFA=1 then
begin
  SaveBuf;
  DrawClipArt(X,Y);
  CFa:=0;
end
end;
   Exit;
end;
//ClipArt end.

IF CurPT<>Nil Then Begin
  Ind:=TPanel(CurPt).HelpContext;// получаем номер инструмента ...
  If (Button= mbLeft) or (Button= mbRight) then begin
   If Fa=1 then  begin Panel1.Enabled:=False; OPStr:='';
    end
   else Ft:=True;

if DrawList = Nil then DrawList:=TStringList.Create;
    ///MPS_Create;
///Msg(IntToStr( X ));
  With ArTools[Ind] do begin
   // Цвета в запись ...
  CurC:=Shape1.Brush.Color;
  CurB:=Shape2.Brush.Color;
  SetParam('ONECLICK','0'); // Флаг "одно-кликовых" иструментов
  SetParam('REDRAW','0');   // Полная перерисовка списка фигур
  SetParam('FA',IntToStr( FA ) );
  SetParam('X',IntToStr( X ) );
  SetParam('Y',IntToStr( Y ) );
  SetParam('OPSTR',OPStr );
  SetParam('CLR',IntToStr(CurC) );
  SetParam('BCLR',IntToStr(CurB) );
  SetParam('FNT_S',IntToStr(PaintBox1.Font.Size) );
  SetParam('FNT_NAME',PaintBox1.Font.Name);
  SetParam('FNT_BUI',IntToStr(
                              Byte( PaintBox1.Font.Bold)*100+
                              Byte(PaintBox1.Font.Underline)*10
                              +Byte(PaintBox1.Font.Italic )
                              ));
  SetParam('CTXT',edit1.Text);

  //  SetParam('Color',IntToStr($FF00) );
   SCR:=LoadStr(InputSCR);

// Непонятно ! Но почему-то нужно двухкратное выполенеие скриптов ...
  PSScript1.Script.Clear; PSScript1.Script.Text:=SCR;
  PSScript1.Compile ; PSScript1.Execute  ;

  PSScript1.Script.Clear; PSScript1.Script.Text:=SCR;
   //Компилятция  скрипта
   If not  rf1.PSScript1.Compile then begin
     ShowMessage('Синтаксическая ошибка (ввод операции)');
    exit;
   end else
   If not  rf1.PSScript1.Execute then  begin  msg('Ошибка выполнения (ввод операции)');
     exit;
   end
   else begin
        OPSTR:=GetParam('OPSTR');
        if GetParam('ONECLICK')='1' then  GoTo L1  // Жестоко но работет !
       end
     end;
//MPS_Free;

fa:=0;
end ;

  If Button= mbRight then
if FT then
   begin
    L1: Fa:=1;
     Ft:=false;
     Panel1.Enabled:=True;
     CurCanvas:=Self.PaintBox1.Canvas;
   DRW_SETPenColor(CurC);
   DRW_SETBrushColor(CurB);

     // единственный случай когда
     // номер элемета известен
     // и нет нужды в поиске по списку

     DrawFig(ind,opstr);
     DrawList.Add(Opstr);
     if GetParam('REDRAW')='1' then PaintBox1Paint(Sender);
     if ul<>NIL then ul.Clear;
     //MSG(DrawList.text);
     Opstr:='';
  Listbox1.Clear;
  Listbox1.Items.Text:=DrawList.Text;

   end
  end

end;

(это реальный обработчик нажатия мыши ... да, знаю , код из разряда "диких" и переписывать его буду не один раз ...
но суть не в нем, а в коротеньком условии ... )

If not rf1.PSScript1.Compile then begin
ShowMessage('Синтаксическая ошибка (ввод операции)');
exit;
end else
If not rf1.PSScript1.Execute then begin msg('Ошибка выполнения (ввод операции)');
exit;
end
else begin
OPSTR:=GetParam('OPSTR');
if GetParam('ONECLICK')='1' then GoTo L1 // Жестоко но работет !
end;



А раньше было
Код: Выделить всё
  If not  rf1.PSScript1.Compile then begin
     ShowMessage('Синтаксическая ошибка (ввод операции)');
    exit;
   end else
   If not  rf1.PSScript1.Execute then  begin  msg('Ошибка выполнения (ввод операции)');
     exit;
   end
   else begin
        OPSTR:=GetParam('OPSTR');
//-----------------------------!!!!!!!!!!!!!!!----------------------------------- 
       if GetParam('ONECLICK')='1' then  begin
      //.....
      //.....
     end
//-----------------------------!!!!!!!!!!!!!!!-----------------------------------
    end;

...



if GetParam('ONECLICK')='1' then begin
//.....
//.....
end


То есть просто добавил еще один "этаж""... и ветка GetParam('ONECLICK')='1' ни разу сработала ...
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

Re: "Этажерка" Begin End ..

Сообщение sign » 26.03.2016 11:29:16

Ищите косяк, пока не поздно.
Никакого отношения begin end, к вашем проблемам в данной программе не имеют.

1.jpg


2.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: "Этажерка" Begin End ..

Сообщение Лекс Айрин » 26.03.2016 12:18:14

Alex2013 писал(а):Alex2013


Alex2013 писал(а):
Код: Выделить всё
If not rf1.PSScript1.Compile then begin
ShowMessage('Синтаксическая ошибка (ввод операции)');
exit;
end else
If not rf1.PSScript1.Execute then begin msg('Ошибка выполнения (ввод операции)');
exit;
end
else begin
OPSTR:=GetParam('OPSTR');
if GetParam('ONECLICK')='1' then GoTo L1 // Жестоко но работет !
end;


А вы уверены, что надо обязательно вкладывать условия друг в друга? Не проще ли использовать Case? И смущают отрицательные условия.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 235

Рейтинг@Mail.ru