Перейти к содержанию
Fire Monkey от А до Я
  • 0

Баг компилятора?


DirtyBorov

Вопрос

Уже несколько раз в ХЕ8 сталкиваюсь с проблемой. Наконец созрел спросить. Имею вот такой код :

procedure LoadGroups;
begin
  for i := 1 to Groups.Count do
   begin
     if Assigned(OnGroup) then
        TThread.Synchronize(nil,
        procedure
        begin
          OnGroup(Self, Groups, Groups.Item[i]);
        end);

     for j := 1 to Groups.Item[i].Users.Count do
      if Assigned(OnGroupUser) then
         TThread.Synchronize(nil,
         procedure
         begin
           OnGroupUser(Self, Groups.Item[i], Groups.Item[i].Users.Item[j]);
         end);
   end;
end;

При компиляции получается вот такая ошибка:

[dcc32 Fatal Error] Engine.pas(159): F2084 Internal Error: URW1175

 

Что это за загадочная ошибка URW1175?  Компилятор не может переварить сложную конструкцию? Возникает она из-за TThread.Synchronize. Если эту конструкцию убрать - все нормально компилируется. Так же ошибка исчезает если закоментировать цикл. 

 

UPD: нашел как обойти проблему. Оказывается компилятор почему то не может переварить цикл for. Что бы он не ругался, достаточно заменить цикл на while.

  for i := 1 to Groups.Count do 

на

  i := 1;
  while (i <> LSkype.Groups.Count) do
 
После этого загадочная ошибка исчезает, и проект нормально компилируется.
 
UPD2: оказывается это уже известный баг, но я об этом не знал :)
Изменено пользователем Brovin Yaroslav
Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Провел небольшой эксперимент в XE8. За неимением полных исходников кое-что пришлось подправить/закомментировать...
 
Эксперимент 1:
 
7113663.png

Если цикловые переменные сделать глобальными (что абсолютно не логично, но судя по выложенному вами фрагменту кода у вас так и есть), то получаем соответствующее предупреждение.
 
Эксперимент 2:
 
7138238.png

Если переменные локальные, всё компилируется без каких либо проблем.

 

Если вместо закомментированных строк вставить вызов какой либо процедуры, например ShowMessage(''), то ни к каким проблемам это не приводит...

Изменено пользователем estra
Ссылка на комментарий
  • 0

На самом деле ваш эксперимент не верен. Само TThread.Synchronize говорит о том, что мой код выполняется в потоке. Я просто удалил лишнее - моя ошибка. Надо было показать  детали. В потоке не получится использовать глобальные переменные для цикла. По крайней мере в коде ниже, компилятор будет ругаться что для цикла надо использовать локальные. Код этот я давно переписал - нет смысла бороться с багами компилятора. Примерно он выглядел так:

procedure RunTask;
var
  LTask: ITask;
begin
  LTask := TTаsk.Create(
    procedure
    var
      i, j: integer;
    begin
      /// Тут был проблемный код 
    end);
  LTask.Start; 
end;
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...