Wieże na szachownicy

0

Witam. Mam taki problem. Program chodzi normalnie dla const n<=8 (n to rozmiar szachownicy). Lecz jeżeli ustalam n>8 to program się zawiesze.

Kod programu:

unit szachy;

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

type
  TForm1 = class(TForm)
    BLosuj_pola: TButton;
    ListBox1: TListBox;
    Edit1: TEdit;
    BGeneruj: TButton;
    BPokaz_ustawienia: TButton;
    BPokaz_wynik: TButton;
    procedure BLosuj_polaClick(Sender: TObject);
    procedure BGenerujClick(Sender: TObject);
    procedure BPokaz_ustawieniaClick(Sender: TObject);
    procedure BPokaz_wynikClick(Sender: TObject);
  private    { Private declarations }
  public    { Public declarations }
  end;

var  Form1: TForm1;

implementation
{$R *.dfm}
 const n = 9;

type Wieze=array [1..n] of 1..n ; 
	Zbior = set of 1..n;
	PlikWyn = file of Wieze;

Var nr:Integer;
z:Zbior;
  szach: array[1..n,1..n] of Integer;

Function len(z:Zbior):Integer;
Var i, le:Integer;
Begin
Le:=0;
For i:=1 to n do
If i in z then le:=le+1;
Len:= le;
end;

Function val(z:Zbior):Integer;
Var i:Integer;
Begin
val:=0;
if Len(z)=1 then
For i:=1 to n do
If i in z then val:=i;//   else val:=0;
end;

function wpisz(k,i:Integer; w:Wieze):Wieze;
Begin
w[k]:=i;
wpisz:=w;
end;

procedure generuj(k:Integer; z:zbior;  w:Wieze; var f:PlikWyn);
Var
 i:Integer;
Begin
if Len(z)=1 then
begin
  w:=wpisz(k,val(z),w) ;
  write(f,w)
end
else
begin
  For i:=1 to n do
    if i in z then
     begin
       w:=wpisz(k,i,w);
       generuj(k+1, z-[i] , w, f);
     end;
end;
end;

procedure TForm1.BLosuj_polaClick(Sender: TObject);
var   j,i:integer;
begin
     randomize;
     for i:=1 to n do
         for j:=1 to n do
         szach[i,j]:= random(10);
end;

procedure TForm1.BGenerujClick(Sender: TObject);
var f0:PlikWyn;
 w :Wieze;
begin
   assignfile(f0,'c:/aa');
   rewrite(f0);
   z:= [1..n];
 generuj(1,z,w,f0);
 closefile(f0);
end;

procedure TForm1.BPokaz_ustawieniaClick(Sender: TObject);
var f0:PlikWyn;
i:integer;
nr:Longint;
 w :Wieze;
s:string;
begin
   nr:=0;
   assignfile(f0,'c:/aa');
  reset(f0);

 while not eof(f0) do
    begin
     read(f0,w);
     nr:=nr+1;
     s:='';
     s:=IntToStr(nr)+'.    ';
     for i:=1 to n do
       s:= s+IntToStr(w[i])+'  ';
     ListBox1.Items.Add(s);
    end;

end;

procedure TForm1.BPokaz_wynikClick(Sender: TObject);
var   i,k0,k:integer;
f0:PlikWyn;
w0, w :Wieze;
s:string;
begin
         k0:=0;
         for i:=1 to n do
            k0:=k0+szach[i,i];
          for i:=1 to n do
            w0[i]:=i;

       assignfile(f0,'c:/aa');
       reset(f0);
     nr:=0;
 while not eof(f0) do
    begin
     read(f0,w);
     nr:=nr+1;
     k:=0;
     for i:=1 to n do
         k:=k+szach[w[i],i];
     if k>k0 then
     begin
     k0:=k;
     w0:=w;
     end;

    end;
    s:='Max dla  ustawienia:  ';
   for i:=1 to n do
       s:= s+IntToStr(w0[i])+'  ';
        s:= s+'   wynosi:  '+IntToStr(k0)+'  ';
     ListBox1.Items.Add('');
   ListBox1.Items.Add(s);

end;

end.
 
0

Łatwiej będzie ci pomóc jeśli powiesz na której linii występuje błąd i z jakim komunikatem.

0

Tu może chodzić o magiczną linijkę:

const n = 9;

Pewnie, gdy wprowadzasz rozmiar co najmniej 9, wychodzi ci poza tabelę. Może wprowadzić nieco większą liczbę?

0
Mariusz Jędrzejowski napisał(a)

Łatwiej będzie ci pomóc jeśli powiesz na której linii występuje błąd i z jakim komunikatem.

blad w zadnej bo "to program się zawiesze".

debuguj.

0

To nie wina const = 9;

Podejrzewam tutaj problem:

procedure TForm1.BLosuj_polaClick(Sender: TObject);
var   j,i:integer;
begin
     randomize;
     for i:=1 to n do
         for j:=1 to n do
         szach[i,j]:= random(10); //<----------------------------- zmień na Random(11);
end;
0

Znalazłem już błąd. Trzeba było zmienną nr zmienić z integer do longint (dla n>8 robiły się już duże liczby). Teraz mam jeszcze takie jedno pytanie. Przerabiam program tak aby n nie było const, więc tablice będą dynamiczne. Użytkownik wpisuje w polu Edit1 jakaś liczbe (rozmiar tablicy) I problem mam z tą częścią kodu:

type Wieze=array[1..n] of 1..n ;
        Zbior = set of 1..n;
        PlikWyn = file of Wieze; 

Nie wiem jak to przerobić. Mógłby ktoś pomóc

0

I tutaj już będzie ciężko, z tego, co się orientuję, to nie ma takiej funkcji typu SetLength dla zbiorów...

0

no niestety dla zbiorów nie ma czegoś takiego jak SetLength. Zbiory mogą być w wielkości od 0 do 255. Będę musiał jakoś inaczej chyba ten problem rozwiązać. Mam jeszcze jeden problem. Jeżeli tworzę tablice Wieze dynamiczną to mam następujący błąd z zmienną PlikWyn "[Error] szachy.pas(32): Type 'Wieze' needs finalization - not allowed in file type". Wiem, że jest to związane z tym że tablica jest dynamiczna, a nie określona jej rozmiar.

type Wieze=array of integer ;
	Zbior = set of 1..n; //zle
	PlikWyn = file of Wieze;
0

A co myślałeś, że będzie tak łatwo ?

BlockRead
BlockWrite
0
type Wieze=array[1..n] of 1..n ;

proponuję to n pisać dużą literą, dla zaznaczenia że to stała.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.