Autor Beitrag
*Eldorado
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

win7, 64 Bit;

BeitragVerfasst: 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.
ausblenden volle Höhe Delphi-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:
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);                   //Erkennung der länge der Zahlen vor und nach Operator
   end;
   if (i-l > 1then
    begin
     for n:=1 to i-l
      do hold1[n]:=Rechnung[n];
    end;
   if (length(Rechnung)-(i+k) > 1then
    begin
     for n:=1 to length(Rechnung)-(i+k)         //Restliche Funktion wird gespeichert
      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];            //Zu rechnende Zahlen werden in neue Variablen gesetzt
   if (Rechnung[i] = '*')
    then erg:=StrToFloat(op1)*StrToFloat(op2)
    else erg:=StrToFloat(op1)/StrToFloat(op2); //Berechnen der Operation
   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];  //Zusammensetzten der bearbeiteten Funktion
  end;
result:=res;
end;

Ich bekomme folgenden Fehler: vvcap.net/db/PpfdaiUlG9mZyoNfT6XK.htp
Und werde auf Zeile 29 Rausgeschmissen : /

grüße
Eldorado

Moderiert von user profile iconGausi: Code- durch Delphi-Tags ersetzt


Zuletzt bearbeitet von *Eldorado am Do 28.07.11 09:21, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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



BeitragVerfasst: Do 28.07.11 00:04 
Was ist ein Paser?
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 28.07.11 01:20 
Ein ägyptischer Wesir der im 13. Jahrhundert vor Christus lebte. :P

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
*Eldorado Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 28

win7, 64 Bit;

BeitragVerfasst: Do 28.07.11 09:20 
user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
Ein ägyptischer Wesir der im 13. Jahrhundert vor Christus lebte. :P


Ihr wisst genau was ich meine :roll:

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 375
Erhaltene Danke: 7

XP, W7, W8
Deutschland
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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



BeitragVerfasst: Do 28.07.11 14:15 
user profile icon*Eldorado hat folgendes geschrieben Zum zitierten Posting springen:
Ihr wisst genau was ich meine :roll:

Wir schon, aber die Suche nicht. Die Suche würde deinen Beitrag nie finden, wenn man nach Parser sucht.