Ошибка с Generic'ами в 2.7.1

Вопросы программирования на Free Pascal, использования компилятора и утилит.

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

Ошибка с Generic'ами в 2.7.1

Сообщение Brainenjii » 05.04.2012 20:15:15

Обновил дома рабочий проект (впервые за месяц) - не собирается. Пишет что-то странное:
Peas/Models/baspectunit.pas(44,17) Warning: An inherited method is hidden by "constructor BTreeObject$1$crc02BE0319.Build(const LongInt);"
Peas/Models/baspectunit.pas(45,16) Warning: An inherited method is hidden by "destructor BTreeObject$1$crc02BE0319.Burn;"
Peas/Models/baspectunit.pas(1,1) Fatal: Compilation aborted

Что это может быть?

Добавлено спустя 1 минуту 17 секунд:
Free Pascal Compiler version 2.7.1 [2012/04/05] for x86_64
Lazarus v1.1 [2012/04/05] 36581M

Добавлено спустя 40 минут 36 секунд:
Нашел... Проблема со статическими членами в Generic'aх
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Ошибка с Generic'ами в 2.7.1

Сообщение Sergei I. Gorelkin » 05.04.2012 20:57:58

Если это текст из окна сообщений Lazarus, то правой кнопкой "скопировать в буфер включая скрытые", и Ctrl+V куда-нибудь - должно стать понятнее.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Ошибка с Generic'ами в 2.7.1

Сообщение Brainenjii » 05.04.2012 22:49:54

Понятнее не стало. Методом проб нашел виновника, уже запостил в багтрекер.
http://bugs.freepascal.org/view.php?id=21654
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Ошибка с Generic'ами в 2.7.1

Сообщение daesher » 06.04.2012 11:31:31

Какой-то пример в багтреккере мутный. В generic не используется <T>, это не хорошо.
daesher
постоялец
 
Сообщения: 221
Зарегистрирован: 09.03.2010 22:17:14

Re: Ошибка с Generic'ами в 2.7.1

Сообщение Brainenjii » 06.04.2012 12:49:49

в 2.7.1 валится даже
Код: Выделить всё
program test;

Type

{ TMyGeneric }

Generic TMyGeneric<T> = Class
  Private
    bValue: Integer; Static;
  Public
End;

{ TMyGeneric }

Type TMyClass = Specialize TMyGeneric<TObject>;

begin
end.                         

Если добавить использование T - сути дело не меняет

Добавлено спустя 8 минут 23 секунды:
Кстати, а есть возможность расшифровать $1$crc02BE0319 ?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Ошибка с Generic'ами в 2.7.1

Сообщение Sergei I. Gorelkin » 06.04.2012 13:31:15

Brainenjii писал(а):Кстати, а есть возможность расшифровать $1$crc02BE0319

Единица означает количество параметров у generic, а crc используется для сокращения строки, которая была длиннее 255 символов.
Вычисление crc - как известно, необратимая операция.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Ошибка с Generic'ами в 2.7.1

Сообщение Brainenjii » 06.04.2012 13:46:24

Ну, можно бы было сделать хэш-таблицу, куда ключом писать crc, а значением - строку, длиннее 255 символов и при выводе в консоль значение по ключу Изображение
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Ошибка с Generic'ами в 2.7.1

Сообщение hinst » 10.04.2012 17:19:21

Если в шаблоне статическое поле, то оно будет одно для всех специализаций, или разное для разных специализаций?
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: Ошибка с Generic'ами в 2.7.1

Сообщение Brainenjii » 12.04.2012 12:47:40

шаблоны (обобщения) в паскале, как понимаю, являются чем-то вроде кодогенератора. Так что для разных спецификаций получатся разные статические поля:
Код: Выделить всё
program Project1;

Type

{ TMyGeneric }

Generic TMyGeneric<T> = Class
  Private
    bValue: Integer; Static;
    Function GetValue: Integer;
    Procedure SetValue(aValue: Integer);
  Public
    Property Value: Integer Read GetValue Write SetValue;
End;

Function TMyGeneric.GetValue: Integer;
Begin
  Result := bValue;
end;

Procedure TMyGeneric.SetValue(aValue: Integer);
Begin
  bValue := aValue;
end;

Type TMyOne = Specialize TMyGeneric<Integer>;
Type TMyTwo = Specialize TMyGeneric<String>;

Var
  aOne1, aOne2: TMyOne;
  aTwo1, aTwo2: TMyTwo;
begin
  aOne1 := TMyOne.Create;
  aOne2 := TMyOne.Create;
  aTwo1 := TMyTwo.Create;
  aTwo2 := TMyTwo.Create;

  aOne1.Value := 100;
  aTwo1.Value := 200;

  WriteLn(aOne2.Value); // <- 100
  WriteLn(aTwo2.Value); // <- 200
end.
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Ошибка с Generic'ами в 2.7.1

Сообщение MageSlayer » 14.04.2012 17:26:25

Было бы неплохо не плодить повторы этого бага.
http://bugs.freepascal.org/view.php?id=21550

Кстати, в моем примере компилятор не падает только на отладочном формате dwarf 3.
MageSlayer
постоялец
 
Сообщения: 216
Зарегистрирован: 07.09.2006 12:30:44


Вернуться в Free Pascal Compiler

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

Сейчас этот форум просматривают: Google [Bot] и гости: 6

Рейтинг@Mail.ru