generics in objFPC

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

generics in objFPC

Beitrag von slai »

Hallo zusammen

Ich habe probleme bei der umsetzung von generics in fpc. Ich möchte einen generischen Stack machen :

Code: Alles auswählen

unit stack;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils;
 
type
 
    { TStack }
 
    generic TStack<T> = class(TObject)
    var private
      thisStack : array of T;
    var public
      function empty():boolean;
      function peek():T;
      function pop():T;
      procedure push(entry : T);
      procedure setEmpty();
    end;
 
implementation
 
{ TStack }
 
function TStack.empty(): boolean;
begin
     result := length(thisStack) = 0;
end;
 
function TStack.peek(): T;
begin
     result := thisStack[length(thisStack)-1];
end;
 
function TStack.pop(): T;
begin
    result := thisStack[length(thisStack)-1];
    SetLength(thisStack,length(thisStack)-1);
end;
 
procedure TStack.push(entry: T);
begin
   SetLength(thisStack,length(thisStack)+1);
   thisStack[length(thisStack)-1] := entry;
end;
 
procedure TStack.setEmpty();
begin
  SetLength(thisStack,0);
end;
 
end.
Nun habe ich in meinem Programm einen einfachen button mit der onClick procedure:

Code: Alles auswählen

procedure TFrmMain.BtnStackTestClick(Sender: TObject);
type
    TStringStack = specialize TStack<String>;
Var
   myStack : TStringStack;
begin
   //myStack := TstringStack.Create;
 
   //myStack.push('test');
 
   //ShowMessage(myStack.peek());
   //ShowMessage(myStack.pop());
   //ShowMessage(BoolToStr(myStack.empty()));
end;
Beim Kompilieren kommt nun:
stack.pas(1,1) Fatal: CompilAn unhandled exception occurred at $00450370 :

Was mache ich da Falsch?

Danke für Antworten.
Windows 7, Lazarus 0.9.28.2 fpc 2.2.4, Firebird 2.1, Zeoslib 6.6.6-stable

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: generics in objFPC

Beitrag von monta »

Code: Alles auswählen

result := length(thisStack) = 0;
Gibt es dieses Konstrukt wirklich?
Johannes

marcov
Beiträge: 1103
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: generics in objFPC

Beitrag von marcov »

monta hat geschrieben:

Code: Alles auswählen

result := length(thisStack) = 0;
Gibt es dieses Konstrukt wirklich?
Ja, natuerlich. Eine Gleichung ist von Typ Boolean.

monta
Lazarusforum e. V.
Beiträge: 2809
Registriert: Sa 9. Sep 2006, 18:05
OS, Lazarus, FPC: Linux (L trunk FPC trunk)
CPU-Target: 64Bit
Wohnort: Dresden
Kontaktdaten:

Re: generics in objFPC

Beitrag von monta »

:oops: logisch, da hab ich den Wald vor Bäumen nicht gesehen.

Irgendwie hab ich nur an die Vorbelegung von Variablen gedacht, sehr peinlich.
Johannes

slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

Re: generics in objFPC

Beitrag von slai »

Kann mir da niemand helfen, wie ich nun genau eine instanz der generischen klasse mit String richtig machen kann?
Windows 7, Lazarus 0.9.28.2 fpc 2.2.4, Firebird 2.1, Zeoslib 6.6.6-stable

marcov
Beiträge: 1103
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: generics in objFPC

Beitrag von marcov »

Hier (2.3.1) funktionierts. Ausgabe

test
test
-1

Dass prüft noch einmal das Generics im 2.2er Branch noch immer beta sind :)

slai
Beiträge: 211
Registriert: Fr 27. Apr 2007, 17:36
Wohnort: Zürich
Kontaktdaten:

Re: generics in objFPC

Beitrag von slai »

hy marcov

Danke für den hint mit fpc 2.2.2.
Habe mich kurz das Changelog von fpc angegeuckt und siehe da in 2.2.4 habe sie einen fix disbezüglich gemacht.
Habe nun Lazarus mit FPC 2.2.5 installiert, e voila es funktioniert :-)
Windows 7, Lazarus 0.9.28.2 fpc 2.2.4, Firebird 2.1, Zeoslib 6.6.6-stable

Antworten