Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2015, 15:01   #1
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
Сообщение Дженерики, дэфаулт-параметры прцедур и фатальная ошибка

На заметку таким же чайникам, как и я:

Вот есть такой модуль
Код:
unit MainFormUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TMyFunc<T> = function: String of object;

  TfrmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    function MyFunc: String;
    { Public declarations }
  end;

  TFooGen<T> = class
    procedure Proc (Func: TMyFunc<T> = nil);
  end;

var
  frmMain: TfrmMain;

implementation

{ TFooGen<T> }

procedure TFooGen<T>.Proc (Func: TMyFunc<T>);
begin
  if Assigned (Func) then ShowMessage (Func)
  else ShowMessage ('Func not assigned');
end;

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  with TFooGen<Byte>.Create do begin
    Proc;
    Free;
  end;
end;

function TfrmMain.MyFunc: String;
begin
  Result := 'TfrmMain.MyFunc';
end;

end.
И всё благополучно работает. Но стоит разделить модуль на две части:
Код:
unit MainFormUnit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, FooGenUnit;

type
  TfrmMain = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    function MyFunc: String;
    { Public declarations }
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  with TFooGen<Byte>.Create do begin
    Proc;
    Free;
  end;
end;

function TfrmMain.MyFunc: String;
begin
  Result := 'TfrmMain.MyFunc';
end;

end.
Код:
unit FooGenUnit;

interface

uses
  Dialogs;

type
  TMyFunc<T> = function: String of object;

  TFooGen<T> = class
  private
  public
    procedure Proc (Func: TMyFunc<T> = nil);
  end;

implementation

{ TFooGen<T> }

procedure TFooGen<T>.Proc (Func: TMyFunc<T>);
begin
  if Assigned (Func) then ShowMessage (Func)
  else ShowMessage ('Func not assigned');
end;

end.
И всё, приехали:
Цитата:
[dcc32 Fatal Error] MainFormUnit.pas(41): F2084 Internal Error: URW1154
Обратите внимание, что ссылка на 41 строку модуля 'MainFormUnit.pas'. А там всего 39 строк

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

Короче, надо было так:
Код:
  TMyFunc<T> = reference to function: String;
reference - ссылка

Ох-ох-охушки ох-ох-о...
Sibedir вне форума Ответить с цитированием
Старый 23.05.2015, 17:07   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Не в тему, но так, к слову:
Внутри Proc предполагается частый вызов Func (вообще то Proc - это Sort, а Func - это TCompareFunc). Посмотрел сгенерированый компилятором код в CPU и решил, что оптиамльнее будет оставить
Код:
  TCompareFunc<T> = function (Left, Right: T): ShortInt;
Сравнение поумолчанию как static-метод класса.
Код:
    class function DefaultCompare (Left, Right: T): ShortInt; static;
а вызов Sort организовать в двух вариантах через overload
Код:
    procedure Sort (CompareFunc: TCompareFunc<T>); overload;
    procedure Sort; overload; inline;
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C#, дженерики, рефлекшн. D][mon Общие вопросы .NET 5 24.12.2014 15:01
фатальная ошибка в программе c++ *Fantom* Помощь студентам 0 20.10.2013 19:24
Фатальная ошибка в MVS 2010. OrioshQaaaa Visual C++ 12 12.06.2012 23:56
PDP 11 - команда пересылки mov 27 27. почему это фатальная ошибка? 13xXx13 Помощь студентам 0 15.01.2012 23:34