[gelöst] Lazarus versus Delphi

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Benutzeravatar
juelin
Beiträge: 296
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

[gelöst] Lazarus versus Delphi

Beitrag von juelin »

Hallo zusammen,
ich habe mal eine Frage.
Ich habe ein Programm Sudoku (vor Jahren) in Delphi geschrieben,
Jetzt habe ich das nach Lazarus portiert.
Die Routine, wo das Sudoku Spiel aufbaut (mit Zufallszahlen)
habe ich 1 zu 1 von Delphi in Lazarus übernommen.
Nun zu meiner Frage.
Diese Routine läuft in Delphi im Sekundenbereich (zwischen 20 bis 300 Sekuneden).
Die gleiche Routine in Lazarus lauft im Minutenbereich (zwischen 5 bis 30 Miniten).
Hat da jemand eine Idee?

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
  var h1: integer;
  var h2: integer;
  var h3: integer;
  var h4: integer;
  var h5: integer;
  var h6: integer;
  var h7: integer;
  var h8: real;
  var h9: real;
  var ha: string;
  var hb: integer;
  var hc: integer;
  var hd: integer;
  var he: integer;
  var hf: integer;
  var hg: real;
  var hh: integer;
  var hi: integer;
  var hj: integer;
  var hk: integer;
  var hl: integer;
  var hm: integer;
  var hn: integer;
  var ho: integer;
  var hq: integer;
  var hr: integer;
  var hs: integer;
  var ht: integer;
  var q1: integer;
  var q2: integer;
  var q3: integer;
  var lla: integer;
  var lla1: integer;
  var zahlen: array[1..9] of integer;
  var hp: array[1..9, 1..3] of integer;
begin
  Label1.Caption:=' '+Chr(169)+'LINSOFT                   S U D O K U                 Date: '+FormatDateTime('DD.MM.YYY',now);
  if (mtasts = 1) then
  begin
    h1:=1;
    if mspiel = 1 then
    begin
      h1:=0;
      JaNein:=messagedlg('Spiel läuft, neu anfangen ?', mtConfirmation, [mbYes, mbNo], 0);
      if (JaNein = mrYes) then
      begin
        feldfarbe:=0;
        mspiel:=0;
        for h2:=1 to 81 do
        begin
          feldnum:=h2;
          Farbsfeld;
          Farbhfeld;
        end;
        h1:=1;
        Form1.Refresh;
        Form1.Repaint;
      end;
    end;
    if h1 = 1 then
    begin
      lla:=1;
      Form1.Cursor:=crHourGlass;
      Form1.Refresh;
      Timer1.Enabled:=False;
      Label2.Caption:='';
      Label9.Caption:='';
      Label10.Caption:='';
      while lla = 1 do
      begin
        Label2.Caption:='Spiel wird aufgebaut, bitte warten.....';
        Label2.Refresh;
        lla1:=0;
        if afeld > 0 then
        begin
          Feldaus;
          feldnum:=afeld;
          feldfarbe:=0;
          Farbhfeld;
          afeld:=0;
        end;
        ialpha:='';
        inummer:=0;
        inumkom:=0;
        ikomma:=0;
        iart:=1;
        izeich:=3;
        istell:=0;
        mlauf:=0;
        mver:=0;
        zfarbe:=0;
        afeld:=0;
        ComboBox1.Enabled:=False;
        spielzeit:=StrToTime('00:00:00');
        for h1:=1 to 81 do
        begin
          orgfeld[h1]:=0;
          loesung[h1]:=0;
          vorgabe[h1]:=0;
          for h2:=1 to 10 do
          begin
            moeglich[h1, h2]:=0;
          end;
        end;
        for h1:=1 to 9 do
        begin
          for h2:=1 to 9 do
          begin
            quadrat[h1, h2]:=0;
            reihe[h1, h2]:=0;
            zeile[h1, h2]:=0;
          end;
        end;
        Bloe;
//        Form1.Refresh;
//        Form1.Repaint;
        Label2.Caption:='Spiel wird aufgebaut, bitte warten.....';
        Label2.Refresh;
        h5:=0;
        h6:=3;
        for h1:=1 to 9 do
        begin
          hc:=0;
          h3:=0;
          hd:=0;
          for h2:=1 to h6 do
          begin
            if h5 < 27 then
            begin
              if hc < h6 then
              begin
                h4:=1;
                while h4 = 1 do
                begin
                  if h3 = 0 then
                  begin
                    Randomize;
                    h3:=Random(10);
                  end;
                  if h3 > 0 then
                  begin
                    if hd = 0 then
                    begin
                      Randomize;
                      hd:=Random(10);
                    end;
                    hb:=0;
                    if hd > 0 then
                    begin
                      he:=0;
                      hf:=0;
                      hj:=0;
                      if h1 = 1 then
                      begin
                        hf:=0;
                        hj:=0;
                      end;
                      if h1 = 2 then
                      begin
                        hf:=1;
                        hj:=0;
                      end;
                      if h1 = 3 then
                      begin
                        hf:=2;
                        hj:=0;
                      end;
                      if h1 = 4 then
                      begin
                        hf:=0;
                        hj:=1;
                      end;
                      if h1 = 5 then
                      begin
                        hf:=1;
                        hj:=1;
                      end;
                      if h1 =6 then
                      begin
                        hf:=2;
                        hj:=1;
                      end;
                      if h1 = 7 then
                      begin
                        hf:=0;
                        hj:=2;
                      end;
                      if h1 = 8 then
                      begin
                        hf:=1;
                        hj:=2;
                      end;
                      if h1 = 9 then
                      begin
                        hf:=2;
                        hj:=2;
                      end;
                      if h3 = 1 then
                      begin
                        he:=0;
                      end;
                      if h3 = 2 then
                      begin
                        he:=0;
                      end;
                      if h3 = 3 then
                      begin
                        he:=0;
                      end;
                      if h3 = 4 then
                      begin
                        he:=1;
                      end;
                      if h3 = 5 then
                      begin
                        he:=1;
                      end;
                      if h3 =6 then
                      begin
                        he:=1;
                      end;
                      if h3 = 7 then
                      begin
                        he:=2;
                      end;
                      if h3 = 8 then
                      begin
                        he:=2;
                      end;
                      if h3 = 9 then
                      begin
                        he:=2;
                      end;
                      hi:=h3 - (he * 3);
                      hb:=(hf * 3) + (he * 9) + hi + (hj * 27);
                      hh:=0;
                      Moeglichkeiten;
                      if hb > 0 then
                      begin
                        hh:=moeglich[hb, 1];
                      end;
                      if hh > 0 then
                      begin
                        hh:=hh + 1;
                        hi:=1;
                        for q1:=2 to hh do
                        begin
                          if moeglich[hb, q1] = hd then
                          begin
                            hi:=0;
                          end;
                          if hi = 1 then
                          begin
                            if hh > 2 then
                            begin
                              hr:=0;
                              while hr < 2 do
                              begin
                                Randomize;
                                hr:=Random(hh);
                              end;
                            end else begin
                              hr:=hh;
                            end;
                            hd:=moeglich[hb, hr];
                          end;
                        end;
                      end;
                      hi:=0;
                      if hb > 0 then
                      begin
                        ffn:=hb;
                        Umrechnungff;
                        hi:=orgfeld[hb];
                        if hi = 0 then
                        begin
                          for hh:=1 to 9 do
                          begin
                            if reihe[rr1, hh] = hd then
                            begin
                              hi:=1;
                            end;
                          end;
                          if hi = 0 then
                          begin
                            for hh:=1 to 9 do
                            begin
                              if zeile[ss1, hh] = hd then
                              begin
                                hi:=1;
                              end;
                            end;
                          end;
                          if hi = 0 then
                          begin
                            for hh:=1 to 9 do
                            begin
                              if quadrat[qq1, hh] = hd then
                              begin
                                hi:=1;
                              end;
                            end;
                          end;
                          if hi = 0 then
                          begin
                            if ((h2 = h6) and (h7 = 0)) then
                            begin
                              orgfeld[hb]:=hd;
                              vorgabe[hb]:=hd;
                              quadrat[qq1, qq2]:=hd;
                              reihe[rr1, rr2]:=hd;
                              zeile[ss1, ss2]:=hd;
                              Moeglichkeiten;
                              ffn:=hb;
                              Umrechnungff;
                              if qq1 = 1 then
                              begin
                                q1:=1;
                                q2:=10;
                                q3:=19;
                              end;
                              if qq1 = 2 then
                              begin
                                q1:=4;
                                q2:=13;
                                q3:=22;
                              end;
                              if qq1 = 3 then
                              begin
                                q1:=7;
                                q2:=16;
                                q3:=25;
                              end;
                              if qq1 = 4 then
                              begin
                                q1:=28;
                                q2:=37;
                                q3:=46;
                              end;
                              if qq1 = 5 then
                              begin
                                q1:=31;
                                q2:=40;
                                q3:=49;
                              end;
                              if qq1 = 6 then
                              begin
                                q1:=34;
                                q2:=43;
                                q3:=52;
                              end;
                              if qq1 = 7 then
                              begin
                                q1:=55;
                                q2:=64;
                                q3:=73;
                              end;
                              if qq1 = 8 then
                              begin
                                q1:=58;
                                q2:=67;
                                q3:=76;
                              end;
                              if qq1 = 9 then
                              begin
                                q1:=61;
                                q2:=70;
                                q3:=79;
                              end;
                              for hk:=1 to 9 do
                              begin
                                zahlen[hk]:=0;
                              end;
                              hk:=moeglich[q1, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q1, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              q1:=q1 + 1;
                              hk:=moeglich[q1, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q1, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              q1:=q1 + 1;
                              hk:=moeglich[q1, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q1, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              hk:=moeglich[q2, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q2, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              q2:=q2 + 1;
                              hk:=moeglich[q2, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q2, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              q2:=q2 + 1;
                              hk:=moeglich[q2, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q2, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              hk:=moeglich[q3, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q3, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              q3:=q3 + 1;
                              hk:=moeglich[q3, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q3, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              q3:=q3 + 1;
                              hk:=moeglich[q3, 1];
                              if hk = 1 then
                              begin
                                hm:=moeglich[q3, 2];
                                hl:=zahlen[hm];
                                hl:=hl + 1;
                                zahlen[hm]:=hl;
                              end;
                              if hk = 0 then
                              begin
                                h4:=0;
                                lla1:=1;
                                hd:=0;
                                h3:=0;
                                orgfeld[hb]:=0;
                                vorgabe[hb]:=0;
                                quadrat[qq1, qq2]:=0;
                                reihe[rr1, rr2]:=0;
                                zeile[ss1, ss2]:=0;
                              end;
                              for hk:=1 to 9 do
                              begin
                                hl:=zahlen[hk];
                                if hl > 1 then
                                begin
                                  h4:=0;
                                  lla1:=1;
                                  hd:=0;
                                  h3:=0;
                                  orgfeld[hb]:=0;
                                  vorgabe[hb]:=0;
                                  quadrat[qq1, qq2]:=0;
                                  reihe[rr1, rr2]:=0;
                                  zeile[ss1, ss2]:=0;
                                end;
                              end;
                            end;
                            if hd > 0 then
                            begin
                              orgfeld[hb]:=hd;
                              vorgabe[hb]:=hd;
                              loesung[hb]:=hd;
                              quadrat[qq1, qq2]:=hd;
                              reihe[rr1, rr2]:=hd;
                              zeile[ss1, ss2]:=hd;
                              feldnum:=hb;
                              feldwert:=hd;
                              hc:=hc + 1;
                              h5:=h5 + 1;
                              h4:=0;
                            end;
                          end else begin
                            hd:=0;
                          end;
                        end else begin
                          h3:=0;
                        end;
                      end;
                    end;
                  end;
                end;
              end;
            end;
          end;
        end;
        lla:=0;
        for h4:= 1 to 9 do
        begin
          h2:=0;
          h3:=0;
          Moeglichkeiten;
          qq1:=h4;
          if qq1 = 1 then
          begin
            q1:=1;
            q2:=10;
            q3:=19;
          end;
          if qq1 = 2 then
          begin
            q1:=4;
            q2:=13;
            q3:=22;
          end;
          if qq1 = 3 then
          begin
            q1:=7;
            q2:=16;
            q3:=25;
          end;
          if qq1 = 4 then
          begin
            q1:=28;
            q2:=37;
            q3:=46;
          end;
          if qq1 = 5 then
          begin
            q1:=31;
            q2:=40;
            q3:=49;
          end;
          if qq1 = 6 then
          begin
            q1:=34;
            q2:=43;
            q3:=52;
          end;
          if qq1 = 7 then
          begin
            q1:=55;
            q2:=64;
            q3:=73;
          end;
          if qq1 = 8 then
          begin
            q1:=58;
            q2:=67;
            q3:=76;
          end;
          if qq1 = 9 then
          begin
            q1:=61;
            q2:=70;
            q3:=79;
          end;
          hn:=0;
          for hk:=1 to 9 do
          begin
            zahlen[hk]:=0;
          end;
          hk:=moeglich[q1, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q1, 2];
            ho:=moeglich[q1, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q1, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          q1:=q1 + 1;
          hk:=moeglich[q1, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q1, 2];
            ho:=moeglich[q1, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q1, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          q1:=q1 + 1;
          hk:=moeglich[q1, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q1, 2];
            ho:=moeglich[q1, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q1, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          hk:=moeglich[q2, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q2, 2];
            ho:=moeglich[q2, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q2, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          q2:=q2 + 1;
          hk:=moeglich[q2, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q2, 2];
            ho:=moeglich[q2, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q2, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          q2:=q2 + 1;
          hk:=moeglich[q2, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q2, 2];
            ho:=moeglich[q2, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q2, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          hk:=moeglich[q3, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q3, 2];
            ho:=moeglich[q3, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q3, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          q3:=q3 + 1;
          hk:=moeglich[q3, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q3, 2];
            ho:=moeglich[q3, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q3, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          q3:=q3 + 1;
          hk:=moeglich[q3, 1];
          if hk = 2 then
          begin
            hm:=moeglich[q3, 2];
            ho:=moeglich[q3, 3];
            if hn = 0 then
            begin
              hn:=hn + 1;
              hp[hn, 1]:=hm;
              hp[hn, 2]:=ho;
              hp[hn, 3]:=1;
            end else begin
              ht:=0;
              for hq:=1 to hn do
              begin
                hr:=hp[hq, 1];
                hs:=hp[hq, 2];
                if ((hr = hm) and (hs = ho)) then
                begin
                  ht:=1;
                  hs:=hp[hq, 3];
                  hs:=hs + 1;
                  hp[hq, 3]:=hs;
                end;
              end;
              if ht = 0 then
              begin
                hn:=hn + 1;
                hp[hn, 1]:=hm;
                hp[hn, 2]:=ho;
                hp[hn, 3]:=1;
              end;
            end;
          end;
          if hk = 1 then
          begin
            hm:=moeglich[q3, 2];
            hl:=zahlen[hm];
            hl:=hl + 1;
            zahlen[hm]:=hl;
          end;
          if hk = 0 then
          begin
            h2:=q1;
          end;
          for hk:=1 to 9 do
          begin
            hl:=zahlen[hk];
            if hl > 1 then
            begin
              h3:=hk;
            end;
          end;
          if hn > 0 then
          begin
            for hq:=1 to hn do
            begin
              hr:=hp[hq, 3];
              if hr > 2 then
              begin
                  h3:=1;
              end;
            end;
          end;
          if h2 > 0 then
          begin
            lla:=1;
          end;
          if h3 > 0 then
          begin
            lla:=1;
          end;
        end;
        if ((lla1 = 0) and (lla = 0)) then
        begin
          for h4:= 1 to 9 do
          begin
            for hk:=1 to 9 do
            begin
              zahlen[hk]:=1;
            end;
            qq1:=h4;
            if qq1 = 1 then
            begin
              q1:=1;
              q2:=10;
              q3:=19;
            end;
            if qq1 = 2 then
            begin
              q1:=4;
              q2:=13;
              q3:=22;
            end;
            if qq1 = 3 then
            begin
              q1:=7;
              q2:=16;
              q3:=25;
            end;
            if qq1 = 4 then
            begin
              q1:=28;
              q2:=37;
              q3:=46;
            end;
            if qq1 = 5 then
            begin
              q1:=31;
              q2:=40;
              q3:=49;
            end;
            if qq1 = 6 then
            begin
              q1:=34;
              q2:=43;
              q3:=52;
            end;
            if qq1 = 7 then
            begin
              q1:=55;
              q2:=64;
              q3:=73;
            end;
            if qq1 = 8 then
            begin
              q1:=58;
              q2:=67;
              q3:=76;
            end;
            if qq1 = 9 then
            begin
              q1:=61;
              q2:=70;
              q3:=79;
            end;
            hk:=moeglich[q1, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q1, hm];
                zahlen[hn]:=0;
              end;
            end;
            q1:=q1 + 1;
            hk:=moeglich[q1, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q1, hm];
                zahlen[hn]:=0;
              end;
            end;
            q1:=q1 + 1;
            hk:=moeglich[q1, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q1, hm];
                zahlen[hn]:=0;
              end;
            end;
            hk:=moeglich[q2, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q2, hm];
                zahlen[hn]:=0;
              end;
            end;
            q2:=q2 + 1;
            hk:=moeglich[q2, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q2, hm];
                zahlen[hn]:=0;
              end;
            end;
            q2:=q2 + 1;
            hk:=moeglich[q2, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q2, hm];
                zahlen[hn]:=0;
              end;
            end;
            hk:=moeglich[q3, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q3, hm];
                zahlen[hn]:=0;
              end;
            end;
            q3:=q3 + 1;
            hk:=moeglich[q3, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q3, hm];
                zahlen[hn]:=0;
              end;
            end;
            q3:=q3 + 1;
            hk:=moeglich[q3, 1];
            if hk > 0 then
            begin
              ht:=hk + 1;
              for hm:=2 to ht do
              begin
                hn:=moeglich[q3, hm];
                zahlen[hn]:=0;
              end;
            end;
            for hk:=1 to 9 do
            begin
              hn:=zahlen[hk];
              if hn = 1 then
              begin
                lla1:=1;
              end;
            end;
          end;
        end;
        if ((lla = 0) and (lla1 = 0)) then
        begin
          loes:=1;
          Moeglichkeiten;
          for h2:=1 to 81 do
          begin
            horgfeld[h2]:=orgfeld[h2];
            hvorgabe[h2]:=vorgabe[h2];
            for h3:=1 to 10 do
            begin
              hmoeglich[h2, h3]:=moeglich[h2, h3];
            end;
            ffn:=h2;
            Umrechnungff;
            hquadrat[qq1, qq2]:=quadrat[qq1, qq2];
            hreihe[rr1, rr2]:=reihe[rr1, rr2];
            hzeile[ss1, ss2]:=zeile[ss1, ss2];
          end;
          h4:=1;
          while h4 = 1 do
          begin
            loes:=1;
            Moeglichkeiten;
            h5:=0;
            h7:=0;
            for h2:=1 to 81 do
            begin
              h6:=orgfeld[h2];
              h3:=loesung[h2];
              if h6 = 0 then
              begin
                h7:=h7 + 1;
                if h3 > 0 then
                begin
                  ffn:=h2;
                  Umrechnungff;
                  orgfeld[h2]:=h3;
                  quadrat[qq1, qq2]:=h3;
                  reihe[rr1, rr2]:=h3;
                  zeile[ss1, ss2]:=h3;
                  h5:=h5 + 1;
                end;
              end;
            end;
            if h5 = 0 then
            begin
              h4:=0;
              if h7 > 0 then
              begin
                lla1:=1;
              end else begin
                for h2:=1 to 81 do
                begin
                  orgfeld[h2]:=horgfeld[h2];
                  vorgabe[h2]:=hvorgabe[h2];
                  for h3:=1 to 10 do
                  begin
                    moeglich[h2, h3]:=hmoeglich[h2, h3];
                  end;
                  ffn:=h2;
                  Umrechnungff;
                  quadrat[qq1, qq2]:=hquadrat[qq1, qq2];
                  reihe[rr1, rr2]:=hreihe[rr1, rr2];
                  zeile[ss1, ss2]:=hzeile[ss1, ss2];
                end;
                if anzvor <> 27 then
                begin
                  if anzvor > 27 then
                  begin
                    h6:=anzvor - 27;
                    h4:=1;
                  end else begin
                    h6:=27 - anzvor;
                    h4:=2;
                  end;
                  while h6 > 0 do
                  begin
                    Randomize;
                    h3:=Random(82);
                    if h3 > 0 then
                    begin
                      if h4 = 1 then
                      begin
                        h5:=orgfeld[h3];
                        if h5 = 0 then
                        begin
                          h5:=loesung[h3];
                          orgfeld[h3]:=h5;
                          vorgabe[h3]:=h5;
                          ffn:=h3;
                          Umrechnungff;
                          quadrat[qq1, qq2]:=h5;
                          reihe[rr1, rr2]:=h5;
                          zeile[ss1, ss2]:=h5;
                          h6:=h6 - 1;
                        end;
                      end else begin
                        h5:=orgfeld[h3];
                        if h5 > 0 then
                        begin
                          h5:=0;
                          orgfeld[h3]:=h5;
                          vorgabe[h3]:=h5;
                          ffn:=h3;
                          Umrechnungff;
                          quadrat[qq1, qq2]:=h5;
                          reihe[rr1, rr2]:=h5;
                          zeile[ss1, ss2]:=h5;
                          h6:=h6 - 1;
                        end;
                      end;
                    end;
                  end;
                  h4:=0;
                  Moeglichkeiten;
                end;
              end;
            end;
          end;
        end;
        if ((lla = 0) and (lla1 = 1)) then
        begin
          lla:=1;
        end;
      end;
      Label2.Caption:='';
      Label2.Refresh;
      for h1:=1 to 81 do
      begin
        h2:=orgfeld[h1];
        if h2 > 0 then
        begin
          feldnum:=h1;
          feldfarbe:=1;
          Farbsfeld;
          feldwert:=h2;
          Anzfeld;
        end;
      end;
      Moeglichkeiten;
      mspiel:=1;
      Timer1.Enabled:=True;
      Form1.Cursor:=crDefault;
//      Form1.Refresh;
    end;
    Form1.Refresh;
    Form1.Repaint;
  end;
end;
Gruß
Jürgen
Zuletzt geändert von juelin am So 16. Feb 2025, 17:33, insgesamt 1-mal geändert.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von Niesi »

:shock:
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Linkat
Lazarusforum e. V.
Beiträge: 561
Registriert: So 10. Sep 2006, 23:24
OS, Lazarus, FPC: Linux Mint 22.1; Lazarus 4.0 FPC 3.2.2; RaspiOS
CPU-Target: AMD 64, ARM 64
Wohnort: nr Stuttgart

Re: Lazarus versus Delphi

Beitrag von Linkat »

Hallo juelin,
ich fürchte dein Programm wird sich niemand ansehen. Du solltest kein ganzes (langes) Programm im Code-Fenster zeigen. Es ist total unübersichtlich.
Auch solltest du, bevor sich zig Leute in dein Programm einarbeiten, selbst versuchen die Problemstellen zufinden.

Hierzu kannst du mit

Code: Alles auswählen

GetTickCount64
die zeitkritischen Prozeduren/Funktionen untersuchen und die Werte vergleichen.

Viel Erfolg dabei.

Gruß, Linkat
Linux Mint 21.3; Lazarus 3.4 FPC 3.2.2; RaspiOS

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von af0815 »

Diese Routine läuft in Delphi im Sekundenbereich (zwischen 20 bis 300 Sekuneden).
Die gleiche Routine in Lazarus lauft im Minutenbereich (zwischen 5 bis 30 Miniten).
Delphi ist (war) windowszentriert. Damit könnte das BS gewisse Fehler im abarbeiten der Messagequece überdecken. Lazarus ist relativ Plattformneutral aufgebaut, daher ergeben sich hier Unterschiede. Besonders dann wenn man Schnittstellen zur GUI mehrfach (unnötig) aufruft. ZB. ein Refreh und ein Repaint nacheiander, was soll das bewirken ? Es macht für mich keinen Sinn. Wenn berechne ich alles auf einmal und übergebe das fertige Ergebnis der GUI. Weil genau dort können Welten an Zeit verschwinden. Und nochmals, Lazarus ist kein Delphi, die beiden Programme sind weitgehen Sourcekompatibel, aber nicht unbedingt Laufzeitkompatibel und vor allen nicht in der Reaktion der GUI gleich.

Linkat hat da schon recht, wenn er dir rät das ganze per Laufzeit zu analysieren.
Zuletzt geändert von af0815 am Di 21. Jan 2025, 22:06, insgesamt 1-mal geändert.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Stevie
Beiträge: 172
Registriert: Di 27. Feb 2024, 22:40

Re: Lazarus versus Delphi

Beitrag von Stevie »

Nachdem ich die fast 1500 Zeilen lange Prozedur einmal quer gescannt habe, würde ich auch sagen, dass nicht nur aufgrund des Umfangs, sondern auch aufgrund diverser Aufrufe unbekannter Prozeduren selbst beim besten Willen niemand zu einer Laufzeitanalyse in der Lage sein wird.

Nur am Rande, weil ich es gerade sah: der Zufallsgenerator muss/sollte in einem Programm nur ein einziges Mail per Randomize() initialisiert werden...

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Lazarus versus Delphi

Beitrag von Jorg3000 »

Hallo!
Die Integer-Operationen werden zeitlich keinen Unterschied machen.
Ich vermute, dass die Funktionen, die in den Schleifen aufgerufen werden, Bildschirm-Controls ändern, vermutlich die Sudoku-Felder. Da kann ich mir sehr gut vorstellen, dass das sehr viel langsamer ist als unter Delphi, was sich insbesondere durch die Schleifen stark bemerkbar macht.
Mir war beim Umstieg von Delphi zu Lazarus leider auch aufgefallen, dass meine Programm-Oberfläche bei Änderungen einer großen Anzahl Controls erheblich lahmer ist als in Delphi.

Dein Programm könntest du vermutlich durch eine saubere Trennung von Programmlogik und Darstellung erheblich beschleunigen, d.h. die Feld-Werte sollten nur in Arrays gespeichert und verändert werden - und erst nach der Neuberechnung einmalig auf die Bildschirm-Controls übertragen werden.
Grüße, Jörg

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von af0815 »

Jorg3000 hat geschrieben: Di 21. Jan 2025, 22:17 Mir war beim Umstieg von Delphi zu Lazarus leider auch aufgefallen, dass meine Programm-Oberfläche bei Änderungen einer großen Anzahl Controls erheblich lahmer ist als in Delphi.
Man darf nicht vergessen, das Delphi von Anfang an komplett die VCL auf Win32 Forms mit den entsprechenden GDI Routinen optimiert wurde. Bei Lazarus muss die eine weitere Schicht mitgeführt werden, die die LCL verschiedene Widgetsets bedienen muss. Weil auch unter Windows kann man QT, GDK und auch Ownerdrawn bei Lazarus verwenden. Der Unterschied kostet auch etwas, nur wenn man die App von Haus aus überlegt aufbaut, so schaut man das Logik und GUI mehr getrennt sind. Das hilft sehr gut, sowohl bei Delphi und Lazarus.
Und generell, wenn eine Routine vielmehr als eine Din A4 Seite ist, so sollte man sich ein Refactoring überlegen.

Der Code von Jülin sieht gewachsen aus und ist meiner Meinung nach,ein gutes Beispiel dafür, das man da Optimierungen vornehmen sollte. Und gerade ein Sudoku eignet sich sehr gut dafür, das man in einem (dynamischen) Array arbeitet und erst am Ende der Routine ausgegeben wird. Slwie der Code im Forum gespostet wurde, wird sich keiner die Mühe machen etwas zu untersuchen, was man nicht kompilieren und laufen lassen kann.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Lazarus versus Delphi

Beitrag von Jorg3000 »

Wie gut, dass wir hierzu geschrieben haben, denn dadurch habe ich gerade eine Lösung bei vielen Bildschirm-Operationen gefunden, nämlich das vorübergehende Unterdrücken des Neuzeichnens (leider nur für Windows).

Code: Alles auswählen

procedure BeginUpdate(AControl: TWinControl);
begin
  {$IFDEF MSWINDOWS}
  if AControl.HandleAllocated then SendMessage(AControl.Handle, WM_SETREDRAW, WPARAM(false), 0);  // Zeichnen ganz abschalten
  {$ELSE}
  AControl.Visible := false;
  {$ENDIF}
end;


procedure EndUpdate(AControl: TWinControl; bChanged: Boolean=true);
begin
  {$IFDEF MSWINDOWS}
  if AControl.HandleAllocated then
    begin
     SendMessage(AControl.Handle, WM_SETREDRAW, WPARAM(true), 0);  // Zeichnen erlauben
     if bChanged then AControl.Invalidate();
    end;
  {$ELSE}
  AControl.Visible := true;
  {$ENDIF}
end;
Ich habe nämlich ein ähnliches Problem: Bei einer Zoom-Funktion weise ich ca. 500 Controls einen neuen BoundsRect zu. Es flackert und dauert lange. Dadurch dass ich jetzt um die äußere Schleife das o.g. BeginUpdate() und EndUpdate() gesetzt habe, flackert nix mehr und es geht spürbar schneller. Sehr schön!

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Lazarus versus Delphi

Beitrag von Zvoni »

Inspiration/Erklärung von hier: https://www.geeksforgeeks.org/program-sudoku-generator/

Code: Alles auswählen

program sudoku;
{$mode objfpc}
Uses Sysutils;
Type
  TMyGrid = Array[0..8,0..8] Of Integer;
  TArr=Array Of Integer;
Var
  arrGrid:TMyGrid;
  a9,a81:TArr;
  x,y:Integer;

Function Shuffle(Const AnArr:TArr):TArr;
Var tmpArr:TArr;
  i,u,r,l:Integer;
Begin
  tmpArr:=AnArr;
  u:=High(tmpArr);
  l:=Length(tmpArr);
  SetLength(Result,l);
  i:=0;
  Randomize;
  Repeat
    r:=Random(u);
    Result[i]:=tmpArr[r];
    Inc(i);
    tmpArr[r]:=tmpArr[u];
    Dec(u);
  until i=l;
end;

Function InitArr(Const a:Tarr):TArr;
Var i,f:Integer;
Begin
  SetLength(Result,Length(a));
  //For var "a9" we want Values 1 to 9, for "a81" we want 0 To 80
  If Length(a)=9 Then f:=1 Else f:=0;
  For i:=0 To High(Result) Do Result[i]:=i+f;
end;

Function UnusedInBox(Const AGrid:TMyGrid; rowStart, colStart, num:Integer):Boolean;
Var i,j:Integer;
Begin
  Result:=True;
  For i:=0 To 2 Do
    For j:=0 To 2 Do
      If AGrid[rowStart+i,colStart+j]=num Then Exit(False);
end;

Procedure FillBox(var AGrid:TMyGrid; row,col:Integer);
Var i,j,c:Integer;
Begin
  c:=0;
  Randomize;
  //Shuffle the values for a9
  a9:=Shuffle(InitArr(a9));
  For i:=0 To 2 Do
    For j:=0 To 2 Do
      Begin
        AGrid[row+i,col+j]:=a9[c];
        Inc(c);
      end;
end;

Function UnusedInRow(Const AGrid:TMyGrid;i,num:Integer):Boolean;
Var j:Integer;
Begin
  Result:=True;
  For j:=0 To 8 Do
    If AGrid[i,j]=num Then Exit(False);
end;

Function UnusedInCol(Const AGrid:TMyGrid;j,num:Integer):Boolean;
Var i:Integer;
Begin
  Result:=True;
  For i:=0 To 8 Do
    If AGrid[i,j]=num Then Exit(False);
end;

Function CheckIfSafe(Const AGrid:TMyGrid;i,j,num:Integer):Boolean;
Begin
  Result:=UnusedInRow(AGrid,i,num) And UnusedInCol(AGrid,j,num) And UnusedInBox(AGrid,i-(i mod 3), j-(j mod 3),num);
end;

Procedure FillDiagonal(var AGrid:TMyGrid);
Var i:Integer;
Begin
  i:=0;
  Repeat
    FillBox(AGrid,i,i);
    Inc(i,3);
  until i>=9;
end;

Function FillRemaining(var AGrid:TMyGrid; i,j:Integer):Boolean;
Var Num:Integer;
Begin
  Result:=False;
  If (j>=9) And (i<8) Then
    Begin
      Inc(i);
      j:=0;
    end;
  If (i>=9) And (j>=9) Then Exit(True);
  If i<3 Then
    Begin
      If j<3 Then j:=3;
    End
  Else If i<6 Then
    Begin
      If j=3*(i div 3) Then
        Inc(j,3);
    End
  Else
    If j=6 Then
      Begin
        Inc(i);
        j:=0;
        If i>=9 Then Exit(True);
      end;
  For Num:=1 To 9 Do
    If CheckIfSafe(AGrid,i,j,Num) Then
      Begin
        AGrid[i,j]:=num;
        //Recursive call!
        If FillRemaining(AGrid,i,j+1) Then
          Exit(True);
        //Needed for Backtracking
        AGrid[i,j]:=0;
      end;
end;
Procedure RemoveCells(var AGrid:TMyGrid;k:Integer);
Var i,j,c,x:Integer;
Begin
  Randomize;  //Necessary?
  c:=0;
  While k>0 Do
    Begin
      i:=a81[c] div 9;
      j:=a81[c] mod 9;
      If AGrid[i,j]<>0 Then
        Begin
          AGrid[i,j]:=0;
          Dec(k);
        end;
      Inc(c);
    end;
end;

Function GenerateGrid(Const BlankCells:Integer):TMyGrid;
Var
  tmpGrid:TMyGrid;
Begin
  //Initialize Array  --> FillChar instead?
  For x:=0 To 8 Do
    For y:=0 To 8 Do tmpGrid[x,y]:=0;

  FillDiagonal(tmpGrid);
  FillRemaining(tmpGrid,0,3);
  RemoveCells(tmpGrid,BlankCells);
  Result:=tmpGrid;
End;

begin
  //Initialize Helper Arrays
  SetLength(a9,9);
  SetLength(a81,81);
  //a81 is needed for last step in "blanking" out cells
  a81:=Shuffle(InitArr(a81));

  //Pass how many blank cells you want
  // lower = easier ..... higher = harder
  arrGrid:=GenerateGrid(20);
  Writeln('----------------');
  For x:=0 To 8 Do
    Begin
      For y:=0 To 8 Do Write(arrGrid[x,y].ToString+#9);
      Writeln;
    end;
  Readln;
end.
Ist..... "flott"
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von Niesi »

.

Das soll jetzt kein Gemecker sein oder so, ABER wenn jemand möchte, dass ich mir etwas anschaue, dann erwarte ich ein kleines Beispielprojekt.

Dazu einfach den Lazarus-Projektordner OHNE compilierte Datei (diese durch Löschen entfernen) packen und hier zum Download bereit stellen.

Ich kopiere mir keinen Quelltext in ein von mir vorzubereitendes Projekt oder so - könnt Ihr gut finden oder nicht, das ist so.

Und wird so bleiben ... :mrgreen:
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6848
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von af0815 »

Ich würde sagen, wir warten mal auf Juelin :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
Niesi
Lazarusforum e. V.
Beiträge: 596
Registriert: So 26. Jun 2016, 19:44
OS, Lazarus, FPC: Linux Mint Cinnamon, Laz 4.1 Fpc 3.2.3 und allerlei mit FpcUpDeLuxe
Kontaktdaten:

Re: Lazarus versus Delphi

Beitrag von Niesi »

af0815 hat geschrieben: Mi 22. Jan 2025, 18:17 Ich würde sagen, wir warten mal auf Juelin :-)
Den hab ich gar nicht ausdrücklich gemeint - auch danach wurden hier Quelltexte als Text eingefügt - ist für mich irgendwie nicht so ganz verständlich. Juelin ist ja noch recht neu im Forum, die anderen sollten das schon wissen ...
Wissen ist das einzige Gut, das sich vermehrt, wenn es geteilt wird ...

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1650
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Lazarus versus Delphi

Beitrag von fliegermichl »

Niesi hat geschrieben: Mi 22. Jan 2025, 18:21
af0815 hat geschrieben: Mi 22. Jan 2025, 18:17 Ich würde sagen, wir warten mal auf Juelin :-)
Den hab ich gar nicht ausdrücklich gemeint - auch danach wurden hier Quelltexte als Text eingefügt - ist für mich irgendwie nicht so ganz verständlich. Juelin ist ja noch recht neu im Forum, die anderen sollten das schon wissen ...
Zumal es die Funktion Projekt veröffentlichen gibt, welche alle notwendigen Dateien in ein zip File packt, welches man dann hier an seinen Beitrag anhängen kann.

Benutzeravatar
Zvoni
Beiträge: 396
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz 2.2.2 FPC 3.2.2)
CPU-Target: 32Bit
Wohnort: BW

Re: Lazarus versus Delphi

Beitrag von Zvoni »

Niesi hat geschrieben: Mi 22. Jan 2025, 18:21
af0815 hat geschrieben: Mi 22. Jan 2025, 18:17 Ich würde sagen, wir warten mal auf Juelin :-)
Den hab ich gar nicht ausdrücklich gemeint - auch danach wurden hier Quelltexte als Text eingefügt - ist für mich irgendwie nicht so ganz verständlich. Juelin ist ja noch recht neu im Forum, die anderen sollten das schon wissen ...
Also gut......
Dateianhänge
sudoku.zip
(1.38 KiB) 56-mal heruntergeladen
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Mathias
Beiträge: 6955
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Lazarus versus Delphi

Beitrag von Mathias »

af0815 hat geschrieben: Di 21. Jan 2025, 22:05
Diese Routine läuft in Delphi im Sekundenbereich (zwischen 20 bis 300 Sekuneden).
Die gleiche Routine in Lazarus lauft im Minutenbereich (zwischen 5 bis 30 Miniten).
Delphi ist (war) windowszentriert. Damit könnte das BS gewisse Fehler im abarbeiten der Messagequece überdecken. Lazarus ist relativ Plattformneutral aufgebaut, daher ergeben sich hier Unterschiede. Besonders dann wenn man Schnittstellen zur GUI mehrfach (unnötig) aufruft. ZB. ein Refreh und ein Repaint nacheiander, was soll das bewirken ? Es macht für mich keinen Sinn. Wenn berechne ich alles auf einmal und übergebe das fertige Ergebnis der GUI. Weil genau dort können Welten an Zeit verschwinden. Und nochmals, Lazarus ist kein Delphi, die beiden Programme sind weitgehen Sourcekompatibel, aber nicht unbedingt Laufzeitkompatibel und vor allen nicht in der Reaktion der GUI gleich.

Linkat hat da schon recht, wenn er dir rät das ganze per Laufzeit zu analysieren.
Wurde da nicht mit der MSE versucht dagegen zu steuren ?
Die MES muss angeblich extrem schnell sein.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten