Autor |
Beitrag |
*Eldorado
      
Beiträge: 28
win7, 64 Bit;
|
Verfasst: Mi 27.07.11 22:59
Hi,
Ich versuche gerade einen eigenen mathe parser zu programieren.
Jetzt habe ich aber das problem, das ich immer einen Fehler bekomme, wobei ich keine ahnung habe, wie der zustande kommen kann.
Vllt. weiß einer von euch ja mehr.
Diese Funktion soll die Multiplikationen und Divisionen lösen.
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:
| function Punkloesung(Rechnung:string):string; var i,l,k,n:integer; var hold1,hold2,res,op1,op2:string; var erg:real; begin hold1:=#0; hold2:=#0; k:=1; l:=1; for i:=1 to length(Rechnung) do begin if (Rechnung[i] = '*') or (Rechnung[i] = '/') then begin while (Rechnung[i-l] <> '+') and (Rechnung[i-l] <> '-') and (Rechnung[i-l] <> '*') and (Rechnung[i-l] <> '/') and (l <> 0) do inc(l); while (Rechnung[i+k] <> '+') and (Rechnung[i+k] <> '-') and (Rechnung[i+k] <> '*') and (Rechnung[i+k] <> '/') and (k <> length(Rechnung)) do inc(k); end; if (i-l > 1) then begin for n:=1 to i-l do hold1[n]:=Rechnung[n]; end; if (length(Rechnung)-(i+k) > 1) then begin for n:=1 to length(Rechnung)-(i+k) do hold2[n]:=Rechnung[i+k+n]; end; for n:=1 to l do op1[n]:=Rechnung[i-l+n-1]; for n:=1 to k do op2[n]:=Rechnung[i+n]; if (Rechnung[i] = '*') then erg:=StrToFloat(op1)*StrToFloat(op2) else erg:=StrToFloat(op1)/StrToFloat(op2); for n:=1 to i-l do res[n]:=Rechnung[n]; res:=res+FloatToStr(erg); for n:=i+k to length(Rechnung) do res[length(res)+1]:=Rechnung[n]; end; result:=res; end; |
Ich bekomme folgenden Fehler: vvcap.net/db/PpfdaiUlG9mZyoNfT6XK.htp
Und werde auf Zeile 29 Rausgeschmissen : /
grüße
Eldorado
Moderiert von Gausi: Code- durch Delphi-Tags ersetzt
Zuletzt bearbeitet von *Eldorado am Do 28.07.11 09:21, insgesamt 1-mal bearbeitet
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 27.07.11 23:06
op1 ist in Zeile 30 noch leer, du versuchst aber auf Buchstaben in dem (nicht existenten) String zuzugreifen. Das kann nicht gut gehen.
Du kannst z.B. vorher die Länge setzen, damit die Buchstaben schon existieren.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 28.07.11 00:04
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Do 28.07.11 01:20
Ein ägyptischer Wesir der im 13. Jahrhundert vor Christus lebte. 
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
*Eldorado 
      
Beiträge: 28
win7, 64 Bit;
|
Verfasst: Do 28.07.11 09:20
Ihr wisst genau was ich meine
jaenicke hat folgendes geschrieben : | op1 ist in Zeile 30 noch leer, du versuchst aber auf Buchstaben in dem (nicht existenten) String zuzugreifen. Das kann nicht gut gehen.
Du kannst z.B. vorher die Länge setzen, damit die Buchstaben schon existieren. |
Stimmt, hätte ich auch selber bemerken können : /
|
|
ssb-blume
      
Beiträge: 375
Erhaltene Danke: 7
XP, W7, W8
Deutschland
|
Verfasst: Do 28.07.11 09:57
Hallo,
wenn Du alleMöglichkeiten (Klammern usw) nutzen willst, mache folgendes:
1. Umwandeln in polnische Notation (mittels Stack leicht)
2. Trennung von Rechenzeichen und Variablen auslesen
3. auswerten und rechnen.
Geht ganz leicht, allerdings machen unäre Operanden etwas Probleme.
_________________ Brain: an apparatus with which we think we think.
|
|
mandras
      
Beiträge: 432
Erhaltene Danke: 107
Win 10
Delphi 6 Prof, Delphi 10.4 Prof
|
Verfasst: Do 28.07.11 12:27
Was genau soll der Parser tun?
Ich hab hier noch einen selbstgebauten den ich mal
für Formeln in Edits geschrieben habe
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Do 28.07.11 13:48
Eine kleinge Einführung zu stackbasierten Parsern hätte ich hier im Angebot. Alternativ gibt's auch bei den Leuten von DelphiGL ein kleines Todorial.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 28.07.11 14:15
|
|