Autor Beitrag
MathiasH
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Fr 23.08.02 12:00 
Hallo
das Problem kennen sicher einige: WIndows stürtzt bei Funktionen aus der Unit Math sehr gern ab, insbesondere, wenn man diese ineirnander verschachtelt, kommt es meistens zum absturz der IDE oder des ganzen Rechners, kann man dagegen was tun, oder muss man sämtliche Sicherheitsabfragen selber schreiben(eigentlich hab ich solche ja schon)

PS.: vor try -except klauseln strotzt der Formelzeichner gerade so, daran kanns nicht liegen, Beinahe jede Trigon-Funktion hat ihre eigene!!!

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Fr 23.08.02 12:26 
was benutzt du denn für ein system? ich verwende windows 2000 und ich hatte noch keinen absturz, auch wenn ich Funktionen aus der Unit Math verschachtelt habe.

P.S.: Habe das SP 2 aufgespielt.

_________________
Viele Grüße
Jakob
MathiasH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Sa 24.08.02 14:52 
98Se, das dumme ist, dass er immer die gesammte IDE abschießt, die dann wieder ne halbe min zu laden braucht :evil: das Problem liegt vielleicht auch darin, dass natürlich ein Parser drin ist, die entscheidenden Stellen haben zwar try/except, aber er schießt mir den kram trotzdem ab :evil:

Ich werd mal den Parser hier reinstellen, vielleicht findet ja wer den Fehler :cry:

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
DeCodeGuru
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1333
Erhaltene Danke: 1

Arch Linux
Eclipse
BeitragVerfasst: Sa 24.08.02 15:31 
Zitat:
Ich werd mal den Parser hier reinstellen, vielleicht findet ja wer den Fehler


Das wäre hilfreich.

_________________
Viele Grüße
Jakob
MathiasH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: So 25.08.02 09:54 
Da kommt der Parser-er ist verdammt lang :wink:

ausblenden volle Höhe Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
212:
213:
214:
215:
216:
217:
//Allgemeine Funktionen
procedure raise_exception(s: String; errortype: TTermErrorType);  //Fehler ausgabe
begin
ErrorResult.Errortype := errortype;
ErrorResult.EMessage := s;
//exit;
end;

function copyab(const s:string; const i:integer):string;  //Rest von s ab i. em Zeichen
begin
  result:=copy(s,i,length(s)-i+1)
end;

function ohneLeerzeichenf(const s:string):string;    //entfernen der Leerzeichen
begin
   Result := stringreplace(s, ' ', '', [rfReplaceAll]);
end;



//----------- im Parser vorkommende Funktionen -----------------

function hoch(const x:real; n:integer):real; //x^n  n El Z
  begin
    if n<0 then result:=1/hoch(x,-n) else //x^n=1/x^(-n) für n<0
      if n=0 then  result:=1 else
        result:=x*hoch(x,n-1)//rekursiv
  end;


function ArcTan2(Y, X: Extended): Extended;
asm
        FLD     Y
        FLD     X
        FPATAN
        FWAIT
end;

function ArcCos(X: Extended): Extended;
begin
  Result := ArcTan2(Sqrt(1 - X*X), X);
end;

function ArcSin(X: Extended): Extended;
begin
  Result := ArcTan2(X, Sqrt(1 - X*X))
end;


function asn(x:real):real; //arcsin
begin
  result:=0;
  if abs(x-1)<1E-15 then result:=pi/2 else     //asn(1)=Pi/2
    if abs(x+1)<1E-15 then result:=-Pi/2 else  //asn(-1)=-Pi/2
    if x*x<1 then result:=arcsin(x) //siehe unit tttmath
     else Raise_Exception('Fehler beim Berechnen von Arcsin('+floatToStr(x) + ')', teTrigon);
end;

function acs(x:real):real;   //Arccos
begin
 result:=0;
 if abs(x-1)<1E-15 then result:=0 else
   if abs(x+1)<1E-15 then result:=Pi else
     if x*x<1 then result:=arcCos(x) //siehe unit tttmath
     else begin
     Raise_Exception('Fehler beim Berechnen von Arccos('+floatToStr(x) + ')', teTrigon);
     end;
end;

function tan(x:real):real;
begin
 result:=0;
 if cos(x)<>0 then tan:=sin(x)/cos(x)
    else Raise_Exception('Fehler beim Berechnen von Tan('+floatToStr(x) + ')', teTrigon);
end;

function wurzel(x:real):real;
begin
  result:=0;
  if x>=-1E-15 //nicht negativ bis auf Rundungsfehler
    then wurzel:=sqrt(x)
      else begin
     Raise_Exception('Fehler beim Berechnen von Sqrt('+floatToStr(x) + ')', teSqrt);
     end;
end;



//----------------- Es folgt ein Parser ---------------------

FUNCTION TermToReal(s: string;x:real): real; //rekursiv!
                                  // s beliebiger Term ohne wissensch Not
                                  // d.h. 1E-17 nicht erlaubt
    var u,v,p,q: string;
    function e(c:char): boolean; //falls möglich wird s zerlegt in s=u+c+v
            //z.B. s=(5+4)*(3+2) Bei c='+' wird u=(5+4) und v=(3+2). Dann e=true
            //    Bei c='*' wird wegen der Klammern e=false
          var i,k:integer;
      begin k:=0; // k zählt die Klammern
            i:=length(s)+1;
            repeat  dec(i);
              if s[i]=')' then inc(k);
              if s[i]='(' then k:=pred(k)
            until (i=1) or ((k=0) and (s[i]=c));
            if i=1 then Begin
              if k<>0 then begin
                Raise_Exception('Syntaxfehler: zu viele Klammern', teBrackets);
                 exit;  //sofort abbrechen
              end;
              result:=false
            End else Begin
              result:=true;
              u:=copy(s,1,i-1);
              v:=copyab(s,i+1)
            End
      end;
 begin

   result:=0;
   s:=OhneLeerzeichenf(s);      //entfernen der Leerzeichen
   u:=copy(s,1,3);
   v:=copyab(s,4);
   p:=copy(s,1,2);
   q:=copyab(s,3);
   if s='' then Begin result:=0; exit End;
   if s[1]='-' then s:='0'+s; //zB. s='-7/3x+14' -> s='0-7/3x+14'
 try
 {Punkt- vor Strichrechnung und vor Potenzen}
 if e('+') then result:=TermToReal(u,x)+TermToReal(v,x)        else
 if e('-') then result:=TermToReal(u,x)-TermToReal(v,x)        else
 if e('*') then result:=TermToReal(u,x)*TermToReal(v,x)        else
 if e('·') then result:=TermToReal(u,x)*TermToReal(v,x)        else //'·'=#183

 if e('/') or e(':') then Begin
   try result:=TermToReal(u,x)/TermToReal(v,x);
   except Raise_Exception('Division durch Null', teDivbyZero); end
 End else

  if e('^') then result:=hoch(TermToReal(u,x),round(TermToReal(v,x)))  else
  if p='lg' then Begin
    try result:=ln(TermToReal(q,x))/ln(10)
    Except Raise_Exception('Fehler beim Berechnen von Lg('+q + ')', teTrigon); End;
  End else

  if p='ln' then Begin
    try result:=ln(TermToReal(q,x))
    except Raise_Exception('Fehler beim Berechnen von Ln('+q + ')', teTrigon); End
  End else

  if p='lb' then Begin
    try result:=ln(TermToReal(q,x))/ln(2);
    except Raise_Exception('Fehler beim Berechnen von Lb('+q + ')', teTrigon); End
  End else

  if u='sin' then result:=sin(TermToReal(v,x))             else //sin im Bogenmaß
  if u='cos' then result:=cos(TermToReal(v,x))             else //cos im bogenmaß
  if u='si_' then result:=sin(Pi/180*TermToReal(v,x))      else //sin im Gradmaß

  if u='atn' then Begin
    try result:=arctan(TermToReal(v,x));
    except Raise_Exception('Fehler beim Berechnen von Arctan('+ v + '), Bogenmaß', teTrigon); End
  End else

  if u='acs' then result:=asn(TermToReal(v,x)) {Fehler s.o. }else

  if u='acc' then result:=acs(TermToReal(v,x)) {Fehler bei asn }else

  if u='at_' then Begin  //arTan im Gradmaß
    try result:=arctan(TermToReal(v,x))*180/Pi;
    except Raise_Exception('Fehler beim Berechnen von Arctan('+v + '), Gradmaß', teTrigon); End
  End else

  if u='as_' then Begin //arcsin im Gradmaß
    try result:=asn(TermToReal(v,x))*180/Pi;
    except Raise_Exception('Fehler beim Berechnen von Arcsin('+v + '), Gradmaß', teTrigon); End
  End else

  if u='ac_' then Begin //arccos im Gradmaß
    try result:=acs(TermToReal(v,x))*180/Pi;
    except Raise_Exception('Fehler beim Berechnen von Arccoc('+v + '), Gradmaß', teTrigon); End
  End else

  if u='co_' then Begin  //cos im Gradmaß
    try result:=cos(Pi/180*TermToReal(v,x));
    except Raise_Exception('Fehler beim Berechnen von cos('+v + '), Gradmaß', teTrigon); End
  End else

  if u='tan' then Begin  //tan im Bogenmaß
    try result:=tan(TermToReal(v,x));
    except Raise_Exception('Fehler beim Berechnen von Tan('+v + '), Bogenmaß', teTrigon); End
  End else

  if u='ta_' then Begin //tan im Gradmaß
    try result:=tan(Pi/180*TermToReal(v,x));
    except Raise_Exception('Fehler beim Berechnen von Tan('+v + '), Gradmaß', teTrigon); End
  End else

  if u='abs' then result:=abs(TermToReal(v,x))             else //Betrag
  if u='exp' then result:=exp(TermToReal(v,x))             else //???
  if u='wur' then result:=wurzel(TermToReal(v,x))          else //Wurzel
  if u='int' then result:=int(TermToReal(v,x))             else //abrunden
  if u='rou' then result:=int(TermToReal(v,x)+0.5)         else //Runden

  if s[1]='(' then Begin
     while (length(s)>1) and (s[length(s)]<>')') do copy(s,1,length(s)-1);
    s:=copy(s,2,length(s)-2);
    result:=TermToReal(s,x)
  End else if s='Pi' then result:=Pi else       //PI
    if s='x' then result:=x else //Variable x   //x
    Begin
      try result:=strToFloat(s); except Raise_Exception('Syntaxfehler in ' + s, teSyntax); result:=0; exit end;
    End
  except
    Raise_Exception('Syntaxfehler in ' + s, teSyntax);

  end;
end;    //end-Termtoreal


Beispielsweise bei term = sin(cos(tan(wur(x)))) hängt sich das Progi selbst auf, aber bei manchen Funktionen wird die ganze IDE abgeschossen

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
mth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mo 26.08.02 02:24 
MathiasH hat folgendes geschrieben:
Beispielsweise bei term = sin(cos(tan(wur(x)))) hängt sich das Progi selbst auf, aber bei manchen Funktionen wird die ganze IDE abgeschossen


Bei einem bestimmten x oder allgemein immer?
MathiasH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Mo 26.08.02 09:47 
als Plotter arbeitet er natürlich alle x-im Sichtbereich durch, bei welchem dann der Fehler passiert weis ich nicht

PS.: ist es normal, dass x^x sich bei -3 zum ersten mal nennenswert von der x-Achse trennt?, und zwischen -3 und 1.5 dauernd zwischen + und - wandert?

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
mth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mo 26.08.02 13:48 
MathiasH hat folgendes geschrieben:
als Plotter arbeitet er natürlich alle x-im Sichtbereich durch, bei welchem dann der Fehler passiert weis ich nicht


Hast du zufällig ein System mit VIA Chipsatz und schneller CPU?
MathiasH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Mo 26.08.02 20:46 
wie definierst du schnell?, er war mal *schnell* (667), wieso fragst du?

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche
mth
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Mo 26.08.02 20:55 
MathiasH hat folgendes geschrieben:
wie definierst du schnell?, er war mal *schnell* (667),


Ich habe die Vermutung das du auf einen recht bekannten Fehler aufgelaufen bist der nicht nur unter Delphi sondern unter jeder Programmiersprache Probleme macht(e). Er tratt vor ca. 1,5 Jahren immer im Zusammenhang mit VIA Chipsatz und einer CPU > 600 Mhz + Playstation Windows auf. Das Problem ist das sich Windows in dieser Kombination bei mehreren schnell hintereinander auftretenden FPU Exceptions aufhängt, fehlerhafte Rechnungen durchführt, Bluescreen etc. alles schon da gewesen.

Such mal unter groups.google nach "VIA fpu exception blue screen". Bei einem Kunden hat es genügt ein neues BIOS aufzuspielen. Vieleicht hast du ja Glück.
MathiasH Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 699

WinXP, Win98SE, Debian, Win95
D5 Stand, D6 Prof
BeitragVerfasst: Mo 26.08.02 21:04 
mal schaun...,
es gibt auch einige andere, wie z.B arcsin, bei denen ein zu großer wert für einen komplettabschuss sorgt, da hätten die Volltrottel doch ne Abfrage einbauen können :evil:

MathiasH

_________________
"Viel von sich reden, kann auch ein Mittel sein, sich zu verbergen."
Friedrich Nietzsche