I replaced TPaintBox with TImage
I don't know if the code does what you want but at least it does not crash.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
TArray=array of double;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Image1: TImage;
Memo1: TMemo;
// PaintBox1: TPaintBox;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
/////////////////////////////////////////////////////////////////////
function calcPHI2(BaseN:double;count:integer;pos:boolean):Tarray;
function calcPHIdbl(BaseN:double):tarray;
procedure memodump1(str:string);
procedure memodump(ar:tarray);
procedure redrawArX(ar:tarray);
var
Form1: TForm1;
implementation
//////////////////////////////////////////////////////////////////
function calcPHI2(BaseN:double;count:integer;pos:boolean):Tarray;
var
ar1,ar2,R_array:tarray;
i,i2:integer;
Base_i,maj,min :double ;
begin
{ar1:=nil;
ar2:=nil;
R_array:=nil;}
base_i:=baseN;
setlength(ar1,count);
setlength(ar2,count);
ar1[0]:=Base_i;
// ar2[count]:=0; //this is wrong
for i:=0 to count-1 do
begin
ar1[i]:=base_i*0.618;
ar2[i]:=baseN-(base_i-ar1[i]);
base_i:=ar1[i];
memodump1(inttostr(round(ar1[i])));
end;
base_i:=baseN;
for i:= 0 to count-1 do
begin
ar1[i]:=base_i*0.618;
ar2[i]:=baseN-(base_i-ar1[i]);
base_i:=ar1[i];
memodump1('---'+inttostr(round(ar2[i])));
end;
i2:=(count*2)-1;
setlength(R_array,(count*2)-1);
for i:=0 to Count-1 do
begin
R_Array[i]:=ar1[i];
R_Array[i2]:=ar2[i];
i2:=i2-1;
end;
result:=R_Array;
{ memodump1('*****');
memodump(ar1);
memodump1('*****');
memodump(ar2);
memodump1('*****');
memodump(R_array);}
end;
///////////////////////////////////////////////////
///////////////////////////////////////////////////
function calcPHIdbl(BaseN:double):tarray;
var
arA,arB,r_array:tarray;
i,i2,ic:integer;
begin
arA:=calcPHI2(BaseN*0.618,6,true); ///// works fine for first call to calcphi2
arB:=calcPhi2(BaseN-(baseN*0.618),6,true); ///// fails here!! (SIGSEV)
ic:=length(arA);
setlength(r_array,length(arA)+length(arB));
for i:= 0 to ic-1 do
begin
r_array[i]:=arA[i];
end;
for i2:= (length(r_array)-1) downto ic do
begin
r_array[i2]:=(baseN*0.618)-arB[i2];
end;
result:=arA;
end;
procedure memodump(ar:tarray);
var
i:integer;
begin
//form1.memo1.clear;
For i:= 0 to length(ar)-1 do
begin
form1.memo1.Lines.add(floattostr(round(ar[i]))); ///rounded to integer
end;
end;
procedure memodump1(str:string);
begin
form1.Memo1.lines.add(str);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
a:tarray;
begin
a:=calcPHI2(300,4,true);////works fine but only 1 time
memodump1('//////////');////2nd try returns 'SIGSEV' error
redrawArX(a);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
a:tarray;
begin
a:=calcphidbl(300);
redrawArX(a);
end;
procedure redrawArX(ar:tarray);
var
i:integer;
begin
form1.image1.canvas.clear;
form1.image1.canvas.pen.Color:=clred;
For i:= 0 to length(ar)-1 do
begin
form1.image1.canvas.moveto(round(ar[i]),0); ///rounded to integer
form1.image1.canvas.Lineto(round(ar[i]),100);
end;
end;
{$R *.lfm}
end.