Hab mit einem Kumpel dieses Programm zur Funktionsanalyse geschrieben und versucht,
die einzelnen Anstiege und Exponenten, erst in einen 'string' zu schreiben und den dann
in einen Gleitkommawert um zu wandeln.
Die entsprechende Stelle ist im Spoiler und das Programm im Anhang.
Hier noch die Fehlermeldung, wenns helfen sollte.
Wenn ihr was findet, worans liegt oder eine andere Möglichkeit, schon mal Danke.
die einzelnen Anstiege und Exponenten, erst in einen 'string' zu schreiben und den dann
in einen Gleitkommawert um zu wandeln.
Die entsprechende Stelle ist im Spoiler und das Programm im Anhang.
var b, y :String; // eingabe text
var h, o, i, j, k, e, d, a, p, g, r, t, l :integer; // zählvariablen
var z, u : real; // werte für die arrays
begin
setlength(mx,0);
setlength(expo,0);
setlength(mxa1,0);
setlength(expoa1,0);
setlength(mxa2,0);
setlength(expoa2,0);
setlength(mxa3,0);
setlength(expoa3,0);
n:=0;
y:=EditF.text; // )
o:=0; // )
i:=1; // )
j:=0; // )
h:=1; // )-- einrichten der zählvariablen
setlength(b,0); // )
d:=1; // )
e:=1; // )
p:=-1; // )
r:=0; // )
for h:=1 to length
do // )
case y[h] of 'x' : o:=o+1; // )-- auszählen der benötigten arraylänge
end; // )
if o>0 then setlength(mx,o); // )
if o>0 then setlength(expo,o); // )-- festlegen der arraylänge
for i:=0 to o-1 do // )
mx:=1; // )
for i:=0 to o-1 do // )-- zuweisen von 1 an jede array stelle
expo:=1; // )
h:=1; // zurücksetzen
for h:=1 to length
do // schleife für die anstiege
if y[h] = 'x' then // auslesen von [y]
if h>1 then //
begin //
g:=1; // multiplikator, wenn anstieg negativ -> g=-1
d:=1; // multiplikator, umschreiben des anstiegs in array
setlength(b,0); // endwert für array
k:=0; // abbruch bedingung in repeat schleife
p:=p+1; // stelle im array
j:=-1; // anzahl der stellen des anstiegs
a:=h-1; // stelle in [y] vor 'x'
repeat j:=j+1; // repeat schleife zur bestimmung der stellen des anstiegs
case y[a-j] of // )
'1','2','3','4','5','6','7','8','9','0': k:=0 // )-- überprüfen ob die stelle [a-j] in [y] eine zahl ist
else k:=1; // )
end; //
if a-j=0 then // )
k:=1; // )-- überprüfen ob anfang von Edit1 erreicht wird
//
until k=1; // abbruchbedingung
//
if y[h-j-1] = '-' then // )
begin // )
g:=-1; // )-- ändern des multiplikators [g] wenn anstieg negativ
end; // )
setlength(b,j+1);
repeat b[j-e] := y[h-e];
e:= e + 1; // )-- umschreiben des anstiegs in den wert
until e-1 = j; // )
e:=1; // zurück setzen von [e]
mx[p]:=StrToFloat(b)*g; // zuweisen des wertes *[g] an das array [mx] an der stelle [p]
t:=h;
end; //
p:=-1; // zurück setzen von [p]
for h:=1 to length
do // schleife für die exponenten
if y[h] = '^' then // auslesen von [y]
if h>1 then //
begin //
r:=0; // bedingung für ein '-'
g:=1; // multiplikator, wenn anstieg negativ -> g=-1
e:=-1; // stelle nach '^'
d:=1; // multiplikator, umschreiben des anstiegs in array
setlength(b,0); // endwert für array
k:=0; // abbruch bedingung in repeat schleife
j:=-1; // anzahl der stellen des anstiegs
p:=p+1; // stelle im array
repeat j:=j+1; // repeat schleife zur bestimmung der stellen des exponenten
case y[h+1+j] of // )
'1','2','3','4','5','6','7','8','9','0': k:=0 // )-- überprüfen ob die stelle [h+1+j] in [y] eine zahl ist
else k:=1; // )
end; //
//
if y[h+1] = '-' then // )
begin // )
if r=0 then // )
begin // )-- schleife für die akzeptanz eines '-'
r:=1; // )
k:=0; // )
end; // )
end; // )
//
if h+j=length
then // )
k:=1; // )-- überprüfen ob ende von Edit1 erreicht wird
//
until k=1; // abbruchbedingung
a:=h+j; // festlegen der letzten stelle des exponenten
if y[h+1] = '-' then // )
begin // )
g:=-1; // )-- ändern des multiplikators [g] wenn anstieg negativ
j:=j-1; // ) ändern des [j] da sonst "StrToFloat('-')" -> fehler
// )
end; // )
setlength(b,j+1);
repeat e:= e + 1; // )
b[j-e] := y[a-e]
// )-- umschreiben des exponenten in den wert
until e+1 = j; // )
expo[p]:=StrToFloat(b)*g; // zuweisen des wertes *[g] an das array [expo] an der stelle [p]
t:=a;
end;
a:=0;
a:=t;
case y[a+1] of '+','-':
begin
j:=0;
a:=length
;
g:=1;
e:=-1;
d:=1;
setlength(b,0);
k:=0;
j:=-1;
repeat j:=j+1;
case y[a-j] of
'1','2','3','4','5','6','7','8','9','0': k:=0
else k:=1;
end;
if y[a-j] = '-' then
begin
g:=-1;
k:=1;
end;
if a-j=0 then
k:=1;
until k=1;
if j>0 then
begin
setlength(b,j+1);
repeat e:= e + 1;
b[j-e] := y[a-e]
until e+1 = j;
end;
n:=StrToFloat(b)*g;
end;
end;
var h, o, i, j, k, e, d, a, p, g, r, t, l :integer; // zählvariablen
var z, u : real; // werte für die arrays
begin
setlength(mx,0);
setlength(expo,0);
setlength(mxa1,0);
setlength(expoa1,0);
setlength(mxa2,0);
setlength(expoa2,0);
setlength(mxa3,0);
setlength(expoa3,0);
n:=0;
y:=EditF.text; // )
o:=0; // )
i:=1; // )
j:=0; // )
h:=1; // )-- einrichten der zählvariablen
setlength(b,0); // )
d:=1; // )
e:=1; // )
p:=-1; // )
r:=0; // )
for h:=1 to length
case y[h] of 'x' : o:=o+1; // )-- auszählen der benötigten arraylänge
end; // )
if o>0 then setlength(mx,o); // )
if o>0 then setlength(expo,o); // )-- festlegen der arraylänge
for i:=0 to o-1 do // )
mx:=1; // )
for i:=0 to o-1 do // )-- zuweisen von 1 an jede array stelle
expo:=1; // )
h:=1; // zurücksetzen
for h:=1 to length
if y[h] = 'x' then // auslesen von [y]
if h>1 then //
begin //
g:=1; // multiplikator, wenn anstieg negativ -> g=-1
d:=1; // multiplikator, umschreiben des anstiegs in array
setlength(b,0); // endwert für array
k:=0; // abbruch bedingung in repeat schleife
p:=p+1; // stelle im array
j:=-1; // anzahl der stellen des anstiegs
a:=h-1; // stelle in [y] vor 'x'
repeat j:=j+1; // repeat schleife zur bestimmung der stellen des anstiegs
case y[a-j] of // )
'1','2','3','4','5','6','7','8','9','0': k:=0 // )-- überprüfen ob die stelle [a-j] in [y] eine zahl ist
else k:=1; // )
end; //
if a-j=0 then // )
k:=1; // )-- überprüfen ob anfang von Edit1 erreicht wird
//
until k=1; // abbruchbedingung
//
if y[h-j-1] = '-' then // )
begin // )
g:=-1; // )-- ändern des multiplikators [g] wenn anstieg negativ
end; // )
setlength(b,j+1);
repeat b[j-e] := y[h-e];
e:= e + 1; // )-- umschreiben des anstiegs in den wert
until e-1 = j; // )
e:=1; // zurück setzen von [e]
mx[p]:=StrToFloat(b)*g; // zuweisen des wertes *[g] an das array [mx] an der stelle [p]
t:=h;
end; //
p:=-1; // zurück setzen von [p]
for h:=1 to length
if y[h] = '^' then // auslesen von [y]
if h>1 then //
begin //
r:=0; // bedingung für ein '-'
g:=1; // multiplikator, wenn anstieg negativ -> g=-1
e:=-1; // stelle nach '^'
d:=1; // multiplikator, umschreiben des anstiegs in array
setlength(b,0); // endwert für array
k:=0; // abbruch bedingung in repeat schleife
j:=-1; // anzahl der stellen des anstiegs
p:=p+1; // stelle im array
repeat j:=j+1; // repeat schleife zur bestimmung der stellen des exponenten
case y[h+1+j] of // )
'1','2','3','4','5','6','7','8','9','0': k:=0 // )-- überprüfen ob die stelle [h+1+j] in [y] eine zahl ist
else k:=1; // )
end; //
//
if y[h+1] = '-' then // )
begin // )
if r=0 then // )
begin // )-- schleife für die akzeptanz eines '-'
r:=1; // )
k:=0; // )
end; // )
end; // )
//
if h+j=length
k:=1; // )-- überprüfen ob ende von Edit1 erreicht wird
//
until k=1; // abbruchbedingung
a:=h+j; // festlegen der letzten stelle des exponenten
if y[h+1] = '-' then // )
begin // )
g:=-1; // )-- ändern des multiplikators [g] wenn anstieg negativ
j:=j-1; // ) ändern des [j] da sonst "StrToFloat('-')" -> fehler
// )
end; // )
setlength(b,j+1);
repeat e:= e + 1; // )
b[j-e] := y[a-e]
// )-- umschreiben des exponenten in den wert
until e+1 = j; // )
expo[p]:=StrToFloat(b)*g; // zuweisen des wertes *[g] an das array [expo] an der stelle [p]
t:=a;
end;
a:=0;
a:=t;
case y[a+1] of '+','-':
begin
j:=0;
a:=length
g:=1;
e:=-1;
d:=1;
setlength(b,0);
k:=0;
j:=-1;
repeat j:=j+1;
case y[a-j] of
'1','2','3','4','5','6','7','8','9','0': k:=0
else k:=1;
end;
if y[a-j] = '-' then
begin
g:=-1;
k:=1;
end;
if a-j=0 then
k:=1;
until k=1;
if j>0 then
begin
setlength(b,j+1);
repeat e:= e + 1;
b[j-e] := y[a-e]
until e+1 = j;
end;
n:=StrToFloat(b)*g;
end;
end;
Hier noch die Fehlermeldung, wenns helfen sollte.
Benachrichtigung über Debugger-Exception
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 0040864B in Modul 'Project1.exe'. Lesen von Adresse 00DAC000'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
Wenn ihr was findet, worans liegt oder eine andere Möglichkeit, schon mal Danke.