Dzień dobry,
zacznę od tego, że pisałem dawno temu programy w Pascalu. Ostatnio w ramach hobby zacząłem pisać w Delphi programy. Dlatego proszę aby ze zrozumieniem potraktować ten post z prośbą o pomoc. Nie opanowałem jeszcze tego kompilatora(i języka).
Otóż napisałem program, którego zadaniem jest wypisać do pliku wszystkie kombinacje z dwumianu Newtona dla zadanego n i k. Algorytm opracowałem, program napisałem ale jest problem. Po uruchomieniu wszystko działa zgodnie z założeniem. Robi co ma robić z jednym wyjątkiem a mianowicie po zakończeniu działania i wyjściu z programu pojawia się "runtime error". Oczywiście próbowałem na własną rękę szukać w sieci informacji o tym konkretnym błędzie ale nie są to odpowiedzi, które rozwiązały by problem a tym bardziej odpowiedziałyby na pytanie "dlaczego tak się dzieje".
Nie dla wszystkich wartości n i k tak się dzieje. Dla n=6 i k =4 lub n=49 k=6 występuje problem i dla wielu innych również ale te zapamiętałem. I teraz najciekawsza rzecz problem nie występuje w przypadku kompilacji w Lazarusie. Korzystam z legalnego Delphi 10.3 Community Edition.
Bardzo proszę kogoś kto zna się na rzeczy aby rzucił okiem i doradził co z tym zrobić.
Z góry dziękuję.
poniżej kod
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
n,k,aktualne_pole : integer;
tablica : array of integer;
tablica_pomocnicza : array of integer;
plik : TextFile;
zmiana : boolean;
licznik_lini_pliku : integer;
licznik_konca_pisania : boolean;
implementation
{$R *.dfm}
function porownanie_tablic(tab,tab2 :array of integer):integer;
var
c,d : byte;
begin
Result := 0;
for c := 0 to k-1 do
begin
for d := 0 to k-1 do
begin
if tab[c] = tab2[d] then
Result:=Result+1;
end;
end;
end;
procedure inicjalizacja_plikow;
begin
AssignFile(plik, 'D:\dwumian_wyniki.txt');
Rewrite(plik);
end;
procedure zamknij_pliki;
begin
CloseFile(plik);
end;
procedure wypisz;
var
w : integer;
begin
for w := 0 to k-1 do
begin
write(plik,IntToStr(tablica[w])+' ');
end;
writeln(plik,' ');
licznik_lini_pliku := licznik_lini_pliku + 1;
end;
procedure wypisz_liczbe_operacji;
begin
write(plik,IntToStr(licznik_lini_pliku));
end;
procedure TForm1.Button1Click(Sender: TObject);
var
index, factor,j,i,l : integer;
begin
inicjalizacja_plikow;
licznik_lini_pliku:=0;
n:= StrToint(Edit1.Text);
k:= StrToint(Edit2.Text);
index := 1;
factor := n;
SetLength(tablica,k-1);
SetLength(tablica_pomocnicza,k-1);
for j := k-1 downto 0 do
begin
tablica_pomocnicza[j] := factor;
factor := factor - 1;
end;
for i := 0 to k-1 do
begin
tablica[i] := index;
index := index + 1;
end;
wypisz;
aktualne_pole := k-1;
zmiana := false;
repeat
if tablica[aktualne_pole]=n then
begin
zmiana := true;
aktualne_pole := aktualne_pole - 1;
end;
tablica[aktualne_pole] := tablica[aktualne_pole] + 1;
if zmiana = true then
begin
for l := aktualne_pole + 1 to k-1 do
begin
tablica[l] := tablica[l-1] + 1;
end;
if tablica[k-1] = n then
begin
aktualne_pole := aktualne_pole -1;
zmiana := true;
end
else
begin
aktualne_pole := k - 1;
zmiana := false;
end;
end;
wypisz;
until porownanie_tablic(tablica,tablica_pomocnicza) = k;
ShowMessage('Gotowe !!!');
wypisz_liczbe_operacji;
zamknij_pliki;
end;
end.