Forum: PC-Programmierung fehlermeldung delphi7


von arwen026 (Gast)


Lesenswert?

Hab einen Taschenrechner programmiert, aber mein Problem ist, das Delphi
beim Test des Programms ab und zu Fehlermeldungen bringt, wenn man zB zu
viele Kommas eingegeben hat.. Weiß einer, wie man das Programm so
schreiben kann, dass solche Fehler nicht auftreten sondern stattdessen
halt eine andere Anweisung befolgt werden kann??

von ,,,, (Gast)


Lesenswert?

Packe das ganze in eine try-except-Umgebung. Du wirst wohl irgendwo
etwas wie StringToFloat() benutzen:

var
  value: real;

try
  value = StringToFloat(...);
  Anweisung1;
except
  Anweisung 2;
end;

von arwen026 (Gast)


Lesenswert?

Klar benutze ich da StrToFloat etc aba was hat das jetzt mit diesem
try-except bla zu tun?? (11. klasse info...kein peil von dem, was du da
sagst!!!) kannst dus mir (bitte)was genauer erklären?? Danke für deine
Hilfe!

von ,,,, (Gast)


Lesenswert?

try-except dient dazu, ein Ausnahmefehler (eine Exception) abzufangen um
geordnet darauf zu reagieren. Ohne try-except werden von deinem Programm
Standardfunktionen benutzt, was sich in der von dir erwähnten
Fehlermeldung äußert.

Wenn du nun z. B. in dein Edit-Feld "2,,665" eingibst, kommt es bei
der Anwendung von StrToFloat() zu einer Exception, weil "2,,665" eben
kein gültiger Ausdruck für die Umwandlung in einen Float-Wert darstellt.
Ein Float-Wert darf ja nur ein Komma enthalten :)

try-except dient eigentlich nur dazu, um dein Programm sicher zu
gestalten. Würde die Exception nicht kommen und StrToFloat() ausgeführt
werden, so kann alles mögliche passieren bis hin zum kompletten
Programmabsturz bzw. bei alten Windowsversionen eben zum
Systemabsturz.

Ich würde übrigens die oben erwähnte 2. Anweisung einfach weglassen.
Wenn die eingegebene Zahl das richtige Format hat, wird der try-Block
ausgeführt: d. h. die Umwandlung der Zahl in einen Float sowie
Anweisung 1. Bei falschem Zahlenformat wird zuerst der try-Block
versucht. Dabei kommt es zur Exception und es wird sofort zum
except-Block gesprungen. In diesem könntest du ein Fenster ausgeben,
dass dem Benutzer mitteilt, dass das zahlenformat falsch ist. Oder
besser, du machst nichts. Auch keine Berechnung, der Benutzer (also du)
merkt dann schon selbst, das was nicht stimmt.

So, mehr fällt mir nicht ein.

von Matthias Beitz (Gast)


Lesenswert?

Fang das doch einfach ab das man nur ein Komma eingeben kann, dazu
einfach den ASCII Code von dem , abfangen und einen boolean auf true
setzen dann bei einem weiteren , einfach die eingabe ignorieren.

von melon (Gast)


Lesenswert?

Hi.
Also ich weiß gar nicht wie man so einen taschenrechner auf delphi7
programmieren soll, brauche das aber dringend!! kann mir das einer
erklären/verraten?!
weiß auch nicht ob ich das hier einfach fragen darf....
es wäre wirklich nett wenn einer hierauf antworten würde!!

von Karl heinz B. (heinzi)


Lesenswert?

Was verstehst Du unter 'Tschenrechner'.
So ein Program, das graphisch einen Taschenrechner darstellt
und der Benutzer mit der Maus auf die tasten klicken kann?
Das ist doch weiter kein Problem.

Oder eher sowas:
Du gibst (als Text) in ein Edit-Feld ein:  (2+3)*4
und in einem anderen Feld (oder in demselben) erscheint 20.

Was Du dazu brauchst, ist ein Formelauswerter.
Viele interpretierbare Sprachen koennen sowas aus dem
Stand. Du schmeisst einer Funktion einen String vor und
die Funktion wertet den Ausdruck aus. Ist ja auch ganz
einfach: Der String wird einfach durch den Interpreter geschleust.
Bei compilierbaren Sprachen ist das nicht ganz so einfach.
Da muss man sich sowas selber bauen, oder eine Bibliothek
dazu benutzen.

Ansaetze dazu gibt es viele. Eine Moeglichkeit arbeitet ueber
Stacks. Ein anderer benutzt Techniken aus dem Bereich 'Compilerbau'
um den String anhand der Grammatik fuer arithmetische Ausdruecke
zu parsen und dann entweder:
  * den Ausdruck gleich waehrend der Parserei auszuwerten
  * einen sog. Expression-Tree aufzubauen und den dann
    (ev. nach Optimierung) auswerten zu lassen. Dies macht
    man zB. wenn der ganze Ausdruck viele male ausgewertet
    werden muss (zb. Formelplotter)
  * Wieder eine andere Moeglichkeit ist es, sich eine kleine
    virtuelle Maschine aufzubauen und aus dem Expression-Tree
    dann quasi ein Maschinenprogram fuer diese virtuell Maschine
    zu 'compilieren'. Ist dann noch einen Tick schneller als die
    (wiederholte) Auswertung des Expression-Tree's.

Hab ich Dich jetzt verwirrt?
Die einfachste Loesung besteht darin, im Web nach einer fertigen
Komponente zu suchen. Solche Formel-Auswerter gibt es wie Sand
am Meer. Jeder Formel-Plotter enthaelt zb. sowas.

von Karl heinz B. (heinzi)


Lesenswert?

Ach ja.
'Parsen' bedeutet: Einen Text nach bestimmten Regeln zu
zerlegen und nachzusehen ob er andere Regeln fuer 'Wohlgeformtheit'
erfuellt.

In C waere zB

   for( i = 0; i < 5; ++i )

wohlgeformt. Denn die Sprache verlangt, dass ein For-Statement
die Gestalt

   "for" "(" Init_Teil ";" Bedingungs_Teil ";" Inkrement_Teil
")"

haben muss (mir gehts jetzt nur ums 'for')

   for( i = 0; i < 5 )

waere es nicht, da ja die Regel ausdruecklich das Vorhandensein
von 2 ";" verlangt.

Den Teil der solche 'Wohlgeformtheit' beschreibt, nennt man die
'Grammatik' einer Sprache. Und ein Program das in der Lage ist
festzustellen ob ein Text einer Grammatik entspricht, ist ein
Parser.

Fuer einfache arithmetische Ausdruecke sieht eine Grammatik
zb so aus:

  Ausdruck = Term
             { ( "+" Term ) |
               ( "-" Term )
             }.

  Term = Faktor
         {
           ( "*" Faktor ) |
           ( "/" Faktor )
         }.

  Faktor = [ "-" ]
           ( Zahl |
             Variable |
             ( "(" Ausdruck ")" )
           ).

  Zahl = Ziffer { Ziffer }.
  Variable = Buchstabe { Buchstabe | Sonderzeichen ).
  Ziffer = "0" | "1" | "2" | "3" | "4" | "5" | "6" |
"7" | "8" | "9".
  Buchstabe = das spar ich mir jetzt
  Sonderzeichen = ditto

Die erste Regel sagt. zb

Ein Ausdruck ist
  ein Term gefolgt von beliebig vielen Einheiten (auch 0 mal!)
  die entweder mit einem "+" anfangen und einen Term enthalten
  oder mit einem "-" anfangen und einen Term enthalten.

[ xxx ]      xxx is 0 oder 1 mal erlaubt
{ xxx }      xxx kann beliebig oft vorkommen, auch 0 mal
( xxx yyy )  xxx und yyy bilden eine Einheit
|            Alternative aus mehreren Moeglichkeiten
"abc"        abc muss im Quelltext genau so vorkommen
abc          abc ist eine andere Grammatik-Regel

von melon (Gast)


Lesenswert?

Hi!
also, es ist nett das du mir das erklärt hast aber ich meinte
eigentlich das erste, was du genannt hast.... -.-''
für mich ist das ein RIESEN problem!!!! ich versteh nicht wie ich da
anfangen muss.... naja, liegt sicher daran das ich ein mädchen bin!!
:)
kannst du mir (oder jemand anderes) sagen, wie ein ganz normaler
taschenrechner programmiert wird? ich hab echt keine ahnung....
danke schon mal...
die mel

von Dirk S. (dirk_schnitzler)


Lesenswert?

Da dir an anderer Stelle schon ausführlich erklärt wurde, wie du
vorgehen kannst, beschränke ich mich auf einen kleinen Tip: F1...
Wirkt bei Borland Wunder. Nennt sich Kontext-Hilfe. Setz´ den Cursor
auf ein Schlüsselwort, welches du nicht verstehst, dann drück´ F1. Oder
markiere unten eine Fehlermeldung und drücke F1.
Und nochwas: Lies das verd..... Manual!

HTH, Dirk.

von Ruedi Wiesendanger (Gast)


Lesenswert?

@ arwen026:

Ich würde Dir empfehlen bei Torry eine Komponente zu suchen
wo Du nur Realzahlen eingeben kannst. Damit hast Du
mal einen Teil Deiner Probleme gelöst.Und dann würde ich den Punkt
'.' anstatt das Koma '.' als Begrenzer eingeben.
Und ja, der Rat mit Try... exept ist auch überlegenswert.
(schon wegen der Division durch null)

Schöne Weinachten
Ruedi

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.