FPC-Bug bei langen Case-anweisungen?

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
Ireyon
Beiträge: 9
Registriert: Sa 8. Mär 2008, 23:34

FPC-Bug bei langen Case-anweisungen?

Beitrag von Ireyon »

hallo.
ich hab da gleich mal ein problem mit folgender case-anweisung:

Code: Alles auswählen

case cbarr[0] of
    $88..$8F, $80..$87, $09, $19, $29, $39, $A0..$A7, $3F, $B8..$BF, $2F, $27, $35, $3D, $05, $0B, $0D, $15, $1B, $1D,
    $25, $2B, $2D, $3B, $F3, $FB, $E3, $08, $EB, $D9, $34, $3C, $04, $03, $0C, $14, $13, $1C, $24, $23, $2C, $33,
    $E9, $02, $12, $70..$77, $0A, $1A, $7E, $78..$7F, $40..$6F, $F9, $00, $B0..$B7, $C1, $D1, $E1, $F1, $F5, $C5, $D5,
    $E5, $C9, $D8, $F8, $D0, $C0, $F0, $E8, $E0, $C8, $17, $07, $1F, $0F, $C7, $CF, $D7, $DF, $E7, $F7, $FF,
    $98..$9F, $37, $90..$97, $A8..$AF:
      r := 1;
    $CE, $C6, $E6, $FE, $10, $DB, $38, $30, $20, $28, $18, $36, $3E, $06, $0E, $16, $1E, $26, $2E, $F6, $D3, $D6, $DE,
    $EE:
      r := 2;
    $EF, $DC, $FC, $D4, $C4, $F4, $EC, $E4, $CC, $CD, $DA, $FA, $D2, $C2, $F2, $EA, $E2, $CA, $C3, $32, $22, $3A, $01,
    $11, $21, $31:
      r := 3;
  //usw.
wenn der zu überprüfende wert aber beispielsweise $EF ist, also 239, wird zu r := 1 anstatt zu r := 3 gesprungen. Das Problem besteht auch, wenn ich den teil, wo r := 3 ausgeführt werden soll, ganz nach oben schreibe.
was soll ich tun?
danke schonmal im vorraus für lösungen.
Benutze lazarus 0.9.24 mit fpc 2.0.4 unter ubuntu 7.10.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

Zuerst einmal den aktuellen fpc benutzen. Die aktuelle Version ist 2.2.0.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Ireyon
Beiträge: 9
Registriert: Sa 8. Mär 2008, 23:34

Beitrag von Ireyon »

OK, es geht aber immernoch nicht.
an den optimierungen liegt es auch nicht, die probleme bestehen weiterhin.

wenn ich aber den block, wo r auf 1 gesetzt wird, auskommentiere, funktioniert das mit den anderen werten. In Delphi 7 unter windows geht alles perfekt.

das problem ist aber gelöst, wenn ich die 4 blöcke in einzelne caseanweisungen schreibe. aber das war glaube ich nicht im sinne des erfinders.

PS:
ich vermute das Problem in der konvertierung der hex-codes. bei hohen werten wie $EF wird jetzt zu dem bereich gesprungen, wo $ED gehandled werden soll. bei kleinen werten passiert das nicht.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Beitrag von Christian »

mach trotsdem mal nen BugReport damit das im nächsten release raus ist.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Ireyon
Beiträge: 9
Registriert: Sa 8. Mär 2008, 23:34

Beitrag von Ireyon »

OK.

Musste das ganze jetzt mit ~500 Zeilen Assembler lösen... er mag wohl keine caseanweisungen mit mehr als 128 zu prüfenden werten. mal gut, dass case-anweisungen schnell in asm-code umwandelbar sind.

Antworten