[GELÖST] Wie kann ich diese Menge in FPC umschreiben?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

[GELÖST] Wie kann ich diese Menge in FPC umschreiben?

Beitrag von Bora4d »

Ich portiere gerade ein Quelltext zu Lazarus. Da hab ich etwas was fpc meckert. Ich werde aus dem Code nicht schlau. Ich habe die Mengen noch nie so benutzt. Weiss jemand wie man es in fpc machen kann? Delphi akzeptiert es.

Code: Alles auswählen

var 
  ByteWert : integer;
 
type
  TXFlag = (xfEins, xfZwei, xfDrei);
  TXFlags = set of TXFlag;
 
var 
  Flags: TXFlags;
begin
  Byte(Flags) := ByteWert and $0F;  //<-- Hier meldet fpc: Error: Illegal type conversion: "Set Of TXFlag" to "Byte"
end;
Zuletzt geändert von Bora4d am Do 14. Okt 2010, 15:36, insgesamt 1-mal geändert.

Keifor
Beiträge: 31
Registriert: Sa 28. Aug 2010, 15:15
OS, Lazarus, FPC: pc-linux-gnu - Funtoo stable, L trunk, FPC trunk
CPU-Target: i686/x86_64

Re: Wie kann ich diese Menge in FPC umschreiben?

Beitrag von Keifor »

Hallo,

Da bist du auf ein nettes Problem gestoßen. FPC handhabt die Mengen in unterschiedlicher Art und Weise je nach Sprachvariante und Version:
Unter anderem gibt es dazu einen Bugtracker Eintrag, das im Delphi Modus Mengen nicht korrekt gehandhabt werden :
http://mantis.freepascal.org/view.php?id=15088 , laut Notizen ist das in 2.5.1 behoben.

Probiere mal folgenden Testcode mit {$Packset 1} wie im Bug Eintrag beschrieben.
(leider kommt es im Board wohl zu Komplikationen mit eckigen Klammern + syntax Hervorhebung, daher Byte(Flags) := Byte(0) statt Flags := []):

Code: Alles auswählen

{$PACKSET 1} 
 
var 
  ByteWert : integer;
 
type
  TXFlag = (xfEins, xfZwei, xfDrei);
  TXFlags = set of TXFlag;
 
var 
  Flags: TXFlags;
begin
  Byte(Flags) := Byte(0);
 
  ByteWert := 6; // = {xfZwei,xfDrei}
  Byte(Flags) := Byte(ByteWert and $0F); // {xfZwei,xfDrei}
end;

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann ich diese Menge in FPC umschreiben?

Beitrag von theo »

S.a: http://www.freepascal.org/docs-html/pro ... 20001.1.57" onclick="window.open(this.href);return false;

Folgendes hat zwar nicht direkt damit zu tun, aber es gibt noch andere lustige Bitpackereien, die man vllt. nicht so kennt. ;-)
z.B.
TTest=(one,two,three,four);
TTestarray = bitpacked array [1..100] of TTest;

Damit (bitpacked) verringert sich der Speicherverbrauch für dieses Array von 400 byte (default in objfpc) auf 25 byte.
D.h. für vier TTest braucht es nur ein Byte.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Wie kann ich diese Menge in FPC umschreiben?

Beitrag von Bora4d »

Vielen Dank.
Ich habe Compiler-Schalter eingefügt es funktioniert nicht. Gleiche Fehlermeldung. (fpc 2.4.3)

Ich glaube jetzt habe das Konstrukt verstanden. Kann Ich:

Byte(Flags) := ByteWert and $0F;

so umschreiben?

Code: Alles auswählen

Flags:=[];
 
if (ByteWert and 1)=1 then Flags = Flags+ [xfEins];   //1 ist binär 0001
if (ByteWert and 2)=2 then Flags = Flags+ [xfEins];   //2 is binär 0010
if (ByteWert and 4)=4 then Flags = Flags+ [xfEins];   //4 is binär 0100
Edit:
Umschreibung ist die Lösung habe eben gerade ausprobiert.
Warum die Leute Sets definieren wenn sie es gar nicht benutzen kapiere ich nicht. Langsam wird aus Pascal Cascal :)
Zuletzt geändert von Bora4d am Do 14. Okt 2010, 15:31, insgesamt 1-mal geändert.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann ich diese Menge in FPC umschreiben?

Beitrag von theo »

Bora4d hat geschrieben: so umschreiben?
Wenn du's richtig schreibst, müsste das gehen (du hast überall xfEins):

Code: Alles auswählen

Flags:=[];
    if (ByteWert and 1)=1 then Flags := Flags+ [xfEins];   //1 ist binär 0001
    if (ByteWert and 2)=2 then Flags := Flags+ [xfZwei];   //2 is binär 0010
    if (ByteWert and 4)=4 then Flags := Flags+ [xfDrei];   //4 is binär 0100
Allerdings funzt bei mir auch das {$PACKSET 1} mit FPC 2.4.0. Habe nicht gesehen, dass bei 2.4.2 da was geändert wurde.

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Wie kann ich diese Menge in FPC umschreiben?

Beitrag von Bora4d »

Du warst schneller, ich hatte letzten Beitrag editiert. :)

xfEins war Tippfehler hatte c/p gemacht.

Wenn du schon da bist noch eine kleine Frage weißt du welchen Schalter man im Quellt benutzen muß um Assembler-Typ anzugeben.
Ich habe nicht herausfinden können.

Normal gibt man entweder bei Projekteinstellungen oder Kommandozeile -Rintel ein. Wenn ich im Quelltext {$R intel} eigebe dann sucht linker nach Resourcendatei mit dem Namen intel-

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: [GELÖST] Wie kann ich diese Menge in FPC umschreiben?

Beitrag von Bora4d »

{$PACKSET 1} hiltf auch. Ich hatte es zwischendurch nach der Definition von TXFlags eingefügt.
Es war ein dummer Flüchtigkeitsfehler von mir.
Jetzt habe ich zwei Lösungen.

Danke Jungs.

Benutzeravatar
theo
Beiträge: 10895
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie kann ich diese Menge in FPC umschreiben?

Beitrag von theo »

Sowas steht alles da
http://www.freepascal.org/docs-html/prog/progse2.html" onclick="window.open(this.href);return false;

{$asmmode intel}

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: [GELÖST] Wie kann ich diese Menge in FPC umschreiben?

Beitrag von Bora4d »

Ich hatte in user-Handbuch gesucht da kam immer -R Schalter.
Die Nacht war gestern lang habe an der falschen Stelle gesucht.

Vielen Dank.

Antworten