Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Жесткий глюк Delphi 2006 и выше


Автор: Louken 11.4.2009, 22:02
Сама тема обсуждалась http://www.gamedev.ru/code/forum/?id=93521.
Проблема пока не решена. Может кто на этом форуме встречался с чем нибудь подобным.
Вкратце о глюке:
Пишу проект, однажды решил сделать небольшой рефакторинг кода, после чего, во время компиляции делфа стала зависать. Если впервый раз скомпилить проект, все ок, все работает, если что то исправить в модулях использующих ateGeometry и скомпилить снова, то делфа виснет намертво, иногда и компилить не надо, просто попытаться получить всплывающую подсказку для функции, результат тот же - делфа виснет.
Исходники проекта для ознакомления можно скачать по ссылке в 13 посте, инструкции по поимке глюка там же.
Глюк у себя обнаружили как минимум еще двое форумчан.
Глюк стабильно наблюдается в Delphi2006, Delphi2007 и Delphi2009. Очень странно, что Borland/CodeGear до сих пор его не устранили.

Автор: kemiisto 11.4.2009, 22:53
Louken, это называется горе от ума. Так не пишут в Delphi! smile Это если коротко...

После каждого нестандартного (т.е. твоего самописного модуля) при подключении его в uses должна быть дописочка in бла-бла-бла:
Код
UnitGameForms in 'UnitGameForms.pas'


Таковой вот ситуации:
Код

uses
  ateUnitEngine, ateUnitMessage, ateUnitInput, ateUnitGUI, ateUnitGeometry,
  ateUnitPerformanceCounter, ateUnitConst, ateUnitLoadTextures, ateUnitUtils, ateUnitModel,
  ateUnitManagerResource, ateUnitOpenGL, ateUnitParticles, ateUnitGUIControl,

вообще быть не должно!

Ручаюсь, что это и есть причина "глюков".

Научись правильно пользоваться инструментом и запомни на будущее Pascal Unit != C++ Header File. Глюк не в компиляторе, а у некоторых в головах.

Автор: Louken 11.4.2009, 23:27
kemiisto
Насчет этого
Цитата

UnitGameForms in 'UnitGameForms.pas'

согласен.
Но уважаемый kemiisto Вы не правы!!!

Создаю новую папку, кидаю туда файл ateGeometry, создаю в ней же файл Project1.dpr
пишу в нем
Код

program Project1;
uses ateUnitGeometry in 'ateUnitGeometry.pas';
begin
end.

Открываю Project1.dpr в Delphi.
Компилирую проект. Пока все в порядке, как и должно быть.
Ставлю курсор между begin и end, жму Ctrl+Space выбираю из списка VectorCross, появляется подсказка о параметрах процедуры, набираю v1, ставлю запятую, во всплывающей подсказке жирным должен выделиться второй параметр, но до этого не доходит, т.к. делфи намертво зависает! Ситуация четко повторяется если делать ровно так, как описано, как в Delphi2007, так и в Delphi2009. Если действовать подругому (каждый раз папку с проектом можно не создавать), то глюк может проявляться по разному.

Так что фразочки типа
Цитата

это называется горе от ума
Научись правильно пользоваться инструментом
Глюк не в компиляторе, а у некоторых в головах

оставьте при себе.

Другими словами, проблемма заключается в модуле ateUnitGeometry, только вот где непонятно.
Я допускаю, что гдето допустил ошибку, но почему компилятор просто мне не показал, где эта ошибка, почему он виснет то? Почему иногда компиляция происходит нормально?

Щас методом копипаста, пытаюсь найти проблеммный участок.

Автор: Louken 12.4.2009, 00:34
Все, методом проб и ошибок вроде нашел багу. Тьфу тьфу тьфу, чтоб не сглазить.

Если кому интересно, то я удалил в модуле ateGeometry слово type в 364 строчке, т.е. было 
Код

TmtNormalf = type TmtPoint3f;

стало
Код

TmtNormalf = TmtPoint3f;


И вседаки совершенно непонятно, что делфе ненравилось, мистика какая то.

Автор: CodeMonkey 12.4.2009, 00:47
Louken, настоятельно рекомендую отправить отчёт об этой проблеме на Quality Central! Особенно, если глюк можно воспроизвести на демо-проекте (приаттачить к отчёту не забудьте). 
Просто вы нашли како-то глюк и можете его воспроизвести - это очень хорошо. Потому что этот же глюк может проявлять себя и в других ситуациях, но в них уже его идентифицировать будет не так просто. Вот почему очень важно, чтобы вы отправили отчёт.

Автор: Louken 13.4.2009, 01:09
Итак, результатом нескольких дней поиска мною был сделал маленький пример, на котором легко можно поймать, рассматриваемый в данном топике, глюк:
1. Создаем новую папку
2. В ней создаем два файла Project1.dpr и Geometry.pas
3. Содержание файла Project1.dpr:
Код

program Project1;
uses Geometry in 'Geometry.pas';
begin
end.

4. Geometry.pas:
Код

unit Geometry;

interface

type
  TmtArray3f  = array[0..2] of Single;

  TmtVector3f = record
  private
    FX, FY, FZ: Single;
  public
    property X: Single read FX write FX;
    property Y: Single read FY write FY;
    property Z: Single read FZ write FZ;
    class operator Implicit(const a: TmtArray3f): TmtVector3f;
  end;

  TmtPoint3f = TmtVector3f;
  TmtNormalf = type TmtPoint3f;

function VectorCross(const v1, v2: TmtVector3f): TmtVector3f;

implementation

class operator TmtVector3f.Implicit(const a: TmtArray3f): TmtVector3f;
begin
end;

function VectorCross(const v1, v2: TmtVector3f): TmtVector3f;
begin
end;

end.

5. Открываем Project1.dpr в Delphi
6. Компилируем проект. Компиляция должна быть успешной.
7. Между begin и end пишем VectorCross
8. Ставим "(", дожидаемся появления всплывающей подсказки
9. Печатаем "v1" и ","
10. Это все! Когда во всплывающей подсказке "жирным" должен выделиться второй параметр, IDE Delphi должна зависнуть.
11. Если заменить строчку
Код
TmtNormalf = type TmtPoint3f;

на
Код
TmtNormalf = TmtPoint3f;

то проблемма больше не наблюдается.

К коду не придерешься, все синтаксически верно.
Вот так из-за одного слова можно наткнуться на такой пренеприятнейший глюк. Так что будьте внимательнее в своих проектах!

Отправил отчет об ошибке в CodeGear. Номер отчета 72930, голосуем.

P.S. У меня уже мания началась, я теперь постоянно ожидаю от Delphi, что она зависнет, нескоро смогу оправиться от пережитого шока.
P.P.S. Тем кто делал программу отправки отчета - Quality Central, надо руки оторвать, бездари.

Автор: Louken 13.4.2009, 13:51
ссылка на отчет об ошибке для голосования
http://qc.embarcadero.com/wc/qcmain.aspx?d=72930

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)