Hallo zusammen,
ich sitz hier vor nem kleinen problem mit einem formelparser.
ich hab ne prozedur geschrieben, die einen klammerfreien ausdruck zerstückelt in zahlen und operatoren.
eine weitere prozedur soll dieses array in ne gleitkommazahl umwandeln. klappt soweit auch ganz gut, nur wenn ich ein negatives vorzeichen hab bekomm ich den fehler, dass der index das maximum meiner tstringlist überschreiten würde.
kann sich das bitte mal jemand ansehen
Delphi-Quellcode:
function arrBerechnen(s: TStringlist): real;
var
i, j: integer;
arr: TStringlist;
ende: boolean;
begin
arr:=TStringlist.create();
arr.clear;
arr:=s;
//Produkt
ende:=false;
i:=1;
if arr.count>1 then
begin
while not(ende) do
begin
if (arr[i]='*') then
begin
arr[i-1]:=floattostr(strtofloat(arr[i-1])*strtofloat(arr[i+1]));
arr.delete(i);
arr.delete(i);
end;
ende:=true;
for j:=0 to arr.count-1 do
if arr[j]='*' then
ende:=false;
i:=i+1;
i:=i mod (arr.count);
end;
end;
//Quotient
ende:=false;
i:=1;
if arr.count>1 then
begin
while not(ende) do
begin
if (arr[i]='/') then
begin
arr[i-1]:=floattostr(strtofloat(arr[i-1])/strtofloat(arr[i+1]));
arr.delete(i);
arr.delete(i);
end;
ende:=true;
for j:=0 to arr.count-1 do
if arr[j]='/' then
ende:=false;
i:=i+1;
i:=i mod (arr.count);
end;
end;
//Differenz
ende:=false;
i:=1;
if arr.count>1 then
begin
while not(ende) do
begin
if (arr[i]='-') then
begin
if i=1 then
begin
arr[i-1]:=floattostr(- strtofloat(arr[i]));
arr.delete(i);
end
else
begin
arr[i-1]:=floattostr(strtofloat(arr[i-1])-strtofloat(arr[i+1]));
arr.delete(i);
arr.delete(i);
end;
end;
ende:=true;
for j:=0 to arr.count-1 do
if (arr[j]='-')and(length(arr[j])=1) then
ende:=false;
i:=i+1;
i:=i mod (arr.count);
end;
end;
//Summe
ende:=false;
i:=1;
if arr.count>1 then
begin
while not(ende) do
begin
if (arr[i]='+') then
begin
arr[i-1]:=floattostr(strtofloat(arr[i-1])+strtofloat(arr[i+1]));
arr.delete(i);
arr.delete(i);
end;
ende:=true;
for j:=0 to arr.count-1 do
if arr[j]='+' then
ende:=false;
i:=i+1;
i:=i mod (arr.count);
end;
end;
result:=strtofloat(arr[0]);
arr.free;
end;