AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generics.TObjectList<T> mit Compilerfehler URW1111

Ein Thema von HJay · begonnen am 24. Jan 2013 · letzter Beitrag vom 24. Jan 2013
Antwort Antwort
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#1

Generics.TObjectList<T> mit Compilerfehler URW1111

  Alt 24. Jan 2013, 17:42
Ich möchte übungshalber eigene Sortierroutinen schreiben, um eine Generics.TObjectList<> zu sortieren und um das Generics-Konzept zu verstehen.

In meinem Beispielprojekt erhalte ich aber immer dem ominösen Compiler Fehler "Interner Fehler URW1111". Was mache ich falsch und was bedeutet das überhaupt?

Könnt Ihr den Fehler bei Euch reproduzieren? Ich habe alles soweit möglich vereinfacht und schließlich folgenden Code als eigenständiges Testprojekt extrahiert. Neues Projekt anlegen, eine Memo-Box und ein Button drauf ziehen.

Code:
unit MainForm;

interface

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

  SortObjectListUnit;

type
  TForm1 = class(TForm)
    Memo1: TMemo; { TMemo1 enthält sechs Zeilen mit je einem Wort }
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    function CompareTest(AItem, BItem: TMyItem): Integer;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
  var A : TTestList;
      j : Integer;

  function MakeTestItem(AString: String): TMyItem;
  begin Result := TMyItem.Create; Result.Dummy := AString; end;
// auf diese Leerzeile zeigt "F2084 Interner Fehler: URW1111"
begin
  A := TTestList.Create(True);
  for j := 0 to Pred(Memo1.Lines.Count) do A.Add(MakeTestItem(Memo1.Lines[j]));

  A.QuickSort(0, Pred(A.Count), CompareTest);

  Memo1.Clear;
  for j := 0 to Pred(A.Count) do Memo1.Lines.Add(A[j].Dummy);

  A.Free;
end;

function TForm1.CompareTest(AItem, BItem: TMyItem): Integer;
begin
  Result := CompareStr(AItem.Dummy, BItem.Dummy);
end;

end.
Code:
unit SortObjectListUnit;

interface

uses
  Windows, Messages, SysUtils, Generics.Collections;

type
  TSortObjectList<T: class> = class(TObjectList<T>)
    type TCompareItems<T> = function(AItem, BItem: T): Integer of Object;
    procedure QuickSort(Left, Right: Integer; ACompareMethod: TCompareItems<T>); overload;
  end;

  TMyItem = class(TObject)
    Dummy: String;
  end;

  TTestList = class(TSortObjectList<TMyItem>)
  end;

implementation

procedure TSortObjectList<T>.QuickSort(Left, Right: Integer; ACompareMethod: TCompareItems<T>);
  var I, J: Integer;
      Pivot, Temp: T;
begin { QuickSort procedure from Classes.pas. }
  repeat
    I := Left;
    J := Right;
    Pivot := Items[(Left + Right) shr 1];
    repeat
      while ACompareMethod(Items[I], Pivot) < 0 do Inc(I);
      while ACompareMethod(Items[J], Pivot) > 0 do Dec(J);
      if I <= J then begin
        Temp := Items[I];
        Items[I] := Items[J];
        Items[J] := Temp;
        Inc(I);
        Dec(J);
      end;
    until I > J;
    if Left < J then QuickSort(Left, J, ACompareMethod);
    Left := I;
  until I >= Right;
end;

end.

Geändert von HJay (24. Jan 2013 um 17:54 Uhr)
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: Generics.TObjectList<T> mit Compilerfehler URW1111

  Alt 24. Jan 2013, 18:18
Versuch es mal so, so sollte es klappen.

Delphi-Quellcode:
type
  TCompareItems<T> = function(AItem, BItem: T): Integer of Object;

  TSortObjectList<T: class> = class(TObjectList<T>)

    procedure QuickSort(Left, Right: Integer; ACompareMethod: TCompareItems<T>); overload;
  end;
Wenn Du es in der Typen Deklaration von TSortObjectList läßt, kommt es zu konflikten zwischen den generischen Typen Parametern von TSortObjectList<T> und TCompareItems<T>. Evtl solltest Du mal versuchen TCompareItems<T2> anzulegen.
Lars
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#3

AW: Generics.TObjectList<T> mit Compilerfehler URW1111

  Alt 24. Jan 2013, 18:31
DANKE!

Ja, dann funktioniert es -- aber warum bloß? Und warum sonst nicht? Wenn alles in einer Unit ist, geht es auch auf die ursprüngliche Art (vergleiche die andere Frage).

Danke, es geht auch, wenn man die erste Definition mit T2 und die nächte mit T1 schreibt:
Code:
 TCompareItems<T2> = function(AItem, BItem: T2): Integer of Object;

  TSortObjectList<T1: class> = class(TObjectList<T1>)
    procedure QuickSort(Left, Right: Integer; ACompareMethod: TCompareItems<T1>); overload;
  end;
Was genau hat denn der Compiler-Fehler URW 1111 zu bedeuten? Ist das ein Fehler von mir oder hat der Compiler da einen Fehler?

Darf man als Bezeichner wie "T2" irgendeinen gültigen Bezeichner verwenden? In allen Beispielen wird T genommen, aber scheinbar ist das völlig egal, richtig?
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

AW: Generics.TObjectList<T> mit Compilerfehler URW1111

  Alt 24. Jan 2013, 18:41
Wie man <T> das nun nennt ist egal. Du könntest auch TObjectList<DeineKlasseDieBenutztWerdenSoll> schreiben.

In XE3 kommt bei mir acuh diese Meldung, wenn ich den Source von dir so kompiliere:

H2509

Trotzdem solltest Du einen QC Eintrag machen, da ein interner Fehler nicht auftreten sollte. Eigentlich müsste eine ordentliche Fehlermeldung kommen oder kompilieren.
Lars
  Mit Zitat antworten Zitat
HJay

Registriert seit: 7. Dez 2009
172 Beiträge
 
Delphi XE7 Enterprise
 
#5

AW: Generics.TObjectList<T> mit Compilerfehler URW1111

  Alt 24. Jan 2013, 18:46
OK, danke, dann weiß ich bescheid.

DANKE!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz