delphi just die when compile this code =)

Тема в разделе "WASM.HEAP", создана пользователем S_T_A_S_, 24 июн 2005.

  1. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Привет всем.

    Объясните дилетанту, почему при компиляции следующего файла, компилятор дельфи 6 (dcc32 v14) умирает?
    Код (Text):
    1. unit foo;
    2. interface
    3.  
    4. type bar = Object
    5.  
    6. public
    7.     destructor  kill();
    8. end;
    9.  
    10. implementation
    11.  
    12. destructor bar.kill();
    13. begin
    14. end;
    15.  
    16. end.
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    S_T_A_S_

    У меня были где-то тоже были сорцы убивающие IDE Delphi/Turbo Pascal 7. Наводит на мысль, что в код обеспечивающий подсветку закрался баг. Но про компилятор я впервые слышу.



    [edit]

    Хм... действительно вылетает. Надо как-нить сообщить в Borland.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    alpet

    а какая версия у тебя?





    IDE от дельфи у меня нет, поэтому как оно поведёт себя на этом коде не знаю. Я запускал dcc32.exe (входит в комплект bcb6) выскакивает системное сообщение об ошибке, если его закрыть, появляется снова, и так до тех пор, пока через taskmanager не снести dcc32. Проблема в этом коде - ключевое слово destructor. Если его заменить на procedure, то всё работает. Только я не пойму, как тогда деструкторы в дельфи использовать???
     
  4. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    У меня две версии шестерки (обе 14-ые):

    6.0.6.163 - из пакета Delphi 6

    6.0.10.155 - из пакета CBuilder 6

    Обе запинаются. Использование ключевого слова Object вместо class, приводит к какой-то проблеме.



    Обьяснение из справки:

     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    constructor Create();

    destructor Destroy();



    или даже
    Код (Text):
    1. constructor Create;
    2. destructor Destroy;


    Вот :)
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Это устаревшее, конечно, но всё же ещё рабочее.

    KOL использует Object и ничего.
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    IceStudent

    При замене kill() на Destroy() эффект остаётся, что не удивительно, т.к. слова близки по смыслу :)
     
  8. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    S_T_A_S_

    Заменить можно на любую букву, ему не нравиться именно object. Мне не понятно только почему он при этом жалует конструкторы.



    [edited]

    В IDE отлавливается исключение в dcc60.dll: чтение по адресу 0x18. Кстати второй компилятор думает намного дольше перед вылетом.



    Колбаса!: Ему не нравится пустой список аргументов деструктора. Если убрать скобки или задать аргумент - все работает.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ээ, не убивайте компилятор :)



    Пишите по спецификации языка.
     
  10. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    А какой язык в дельфи? C точки зрения Object Pascal код кореектен.

    (кстати, в Component Pascal нет не только class, но и object)
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Код (Text):
    1.  
    2. unit ubar;
    3.  
    4. interface
    5.  
    6.   type
    7.     TBar = class(TObject)
    8.     public
    9.      constructor Create;
    10.      destructor Destroy; override;
    11.     end;
    12.  
    13.     Bar = object
    14.      public
    15.       constructor Create;
    16.       destructor Destroy;
    17.      end;
    18.  
    19. implementation
    20.  
    21. { TBar }
    22. constructor TBar.Create;
    23. begin
    24.  
    25. end;
    26.  
    27. destructor TBar.Destroy;
    28. begin
    29.  
    30. end;
    31.  
    32. { Bar }
    33. constructor Bar.Create;
    34. begin
    35.  
    36. end;
    37.  
    38. destructor Bar.Destroy;
    39. begin
    40.  
    41. end;
    42.  
    43. end.




    C++ компилятор тоже можно убить извратами, так что особо не радуйтесь :)
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    S_T_A_S_

    Ошибка компилятора - к списку аргументов деструктора у типа Object повышенные требования :)

    Вот рабочий кодъ:
    Код (Text):
    1.  
    2. unit foo;
    3. interface
    4. type bar = object
    5. public
    6.  destructor kill ();
    7. end;
    8. implementation
    9.  
    10. destructor bar.kill;
    11. begin
    12. end;
    13. end.
    14.  


    end.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    >




    Ну и что? Dispose освобождает память, а деструкторы предназначены для других целей. Другое дело, что то, что есть в паскале конструкторами\деструкторами можно назвать с натяжкой, поскольку их необходимо вызывать явно :/
     
  14. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    destructor bar.kill();

    begin

    end;

    если убрать здесь скобки то компилится

    дело в том что скобки в процедурах буз параметров раньше были ошибкой

    наверное пропустили в парсере для конструкторов- деструкторов испарвить:derisive:



    дельфи 7 тоже валится
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Да, destructor bar.kill(); убило компилятор :)



    А destructor Bar.Kill(i: Integer); оставило в живых.



    Ну, баг так баг. Теперь ещё и известный.
     
  16. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    S_T_A_S_

    Dispose как delete в C++ вызывает деструктор по умолчанию, это видимо единственная возможность его неявного вызова. Плохо это или хорошо, сказать немогу :dntknw:
     
  17. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    S_T_A_S_

    не совсем так , при завершении программы деструктор вызываетс амтоматически :derisive:

    а конструкторы для object должны вызываться автоматически
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    alpet >




    Спасибо!

    ну и дебилизм, скобочки распарсить не могут =)
     
  19. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    S_T_A_S_

    Судя по вылету - первые скобочки он пропарсил успешно, а увидев вторые создал пустой список параметров деструктора. Потом попытался скомпилировать вместе с списком и видимо обратился к отсутствующему параметру [0].
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    staier >




    Что значит при завершении программы? Это должно быть верно только для статических экземпляров. Если у меня локальный (автоматический) экземпляр, то деструктор разумно вызывать при завершении жизни объекта (при выходе их функции). Если деструктор для такого объекта будет вызываеться (неявно) при завершении - это баг гораздо более серьёзный, чем то что в этом топе :derisive: