![]() |
Matheparser: Schleifenproblem bei Kommata
Hi,
mein kleiner Matheparser macht mir beim Komma Ärger: Bei der Rechnung 1,5*2.3 verwandelt er 1 , 5 zu zu 1,5. Allerdings geschieht dies nicht bei 2.3. Warum ? Mir ist nur aufgefallen, dass ich die Arraygröße verändere und die Schleife deshalb vlt. schon früher zu Ende ist, aber falls das überhaupt Auswirkungen hat, wie könnte man dann das Problem lösen ?
Delphi-Quellcode:
function Split(s : String) : TDynTokArray; // Ein Array für die Klasse TToken, spielt allerdings keine großartige Rolle hierbei; Split teilt, wie der Name schon sagt, alles in Tokens auf. Dennoch muss eine Kommazahl in einem Eintrag statt in 3 Einträgen stehen.
begin ... for i := 0 to High(Result) do begin if (Result[i].Val = ',') or (Result[i].Val = '.') then // der Punkt wird hier abgefragt, also ist hier nicht die Fehlerquelle begin Result[i-1].Val := Result[i-1].Val + Result[i].Val + Result[i+1].Val; // Zusammensetzen for j := i to High(Result) do // der Rest im Array verschoben werden Result[j] := Result[j+1]; SetLength(Result, High(Result)); // der unnötige Rest, welcher sogar noch Fehler verursachen würde, wird gelöscht end; end; ... end; |
Re: Matheparser: Schleifenproblem bei Kommata
Den . <-- , Fehler sehe ich hier auch nicht.
Aber : 1. Musst du das Array nicht um 2 Plätze verschieben? 2. Was passiert wenn ich den Ausdruck ".5*10" eingebe? |
Re: Matheparser: Schleifenproblem bei Kommata
Moin Nils,
Zitat:
Üblicherweise wird ein Token möglichst lang erzeugt, dass heisst: Solange für einen erkannten möglichen Tokentyp Zeichen folgen, gehören die mit zum aktuellen Token. Beispiel: Bezeichner. Wenn für diese die Regel gilt: Sie müssen mit _ oder Buchstabe anfangen, und dürfen ansonsten _, Buchstaben oder Ziffern enthalten, so müsste man beim Erkennen eines _ oder Buchstaben anschliessend alle Zeichen als Tokenattribut übernehmen, bis ein Zeichen ungleich _, Buchstabe, Ziffer auftritt. Ein ähnliches Vorgehen gilt dann auch bei Zahlen. (Annahmen: Eine Zahl muss mit einer Ziffer beginnen oder enden, obwohl auch ein . bzw. , am Anfang oder Ende denkbar wäre. Es werden keine Exponenten verwendet) Man trifft auf eine Ziffer: Jetzt wird solange durchgegangen, wie man eine Ziffer, ein . oder ein , findet. Bei . oder , normalisiert man dass jetzt auf, z.B., . Anschliessend geht man durch, bis man auf ein Zeichen ungleich Ziffer stösst. Solche Sachen werden oft mit Hilfe von ![]() ![]() Klingt komplizierter als es ist. |
Re: Matheparser: Schleifenproblem bei Kommata
Zitat:
Gruss Reinhard |
Re: Matheparser: Schleifenproblem bei Kommata
Hi.
schließe mich Reinhard und Christian an.. Nichts trennen, was zusammen gehört und nichts "rückwärts lesen" wie hier:
Delphi-Quellcode:
Guck mal hier in den Scanner:
for j := i to High(Result) do // der Rest im Array verschoben werden
Result[j] := Result[j+1]; ![]() Und so machten es damals die Profis: ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz