Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#15

AW: kurvendiskussion linearer Funktionen mit Delphi

  Alt 6. Mär 2014, 23:14
Bjoerk hat jetzt die Vereinfachungen vorweg genommen. Dennoch die Erklärung warum dein Ansatz nicht ging:

if m='' then... [...] m mit real definiert
Genau das ist das Problem:
"m" ist real, "''" ist ein String. Ein "if" will einen Boolean. Delphi ist insbesondere für seine Typsicherheit bekannt - heisst: Wenn eine Operation ein Boolean erwartet, muss auch ein Boolean da stehen. Es reicht nicht, wie bei vielen Scriptsprachen oder manchen anderen Sprachen, dass dort ein Wert steht, der sich ggf. als Boolean interpretieren ließe. Delphi ist da sehr streng, was allgemein als großer Vorteil gesehen wird. (Man wird gezwungen sich um die Art seiner Daten genaue Gedanken zu machen, so dass u.U. ungewollte implizite Konversionen nicht zu bösen Überraschungen führen.)

In deinem Fall darfst du also if m='then nicht machen, da du dort if real=string then machst, was schon mal nicht geht. Eine Zahl ist mit einer Zeichenkette nicht vergleichbar, auch wenn 0 und '' (für dich) erstmal gleichwertig klingen. (Sind sie nicht aus Sicht des Computers, und das ist auch gut so.) Desweiteren wird dann bemängelt, dass dort kein Boolean ist, weil der Vergleich bereits nicht funktioniert hat. Ein gültiger(!) Vergleich endet immer in einem Boolean: Entweder er ergibt wahr oder falsch. Kann kein Vergleich gemacht werden, so kann man weder "wahr" noch "falsch" aussagen, und folglich ist dies keine "Boolsche Aussage" mehr.

Der Text in deinem Edit-Feld dagegen ist ein String, den man mit "''" vergleichen kann. Und genau das ist auch die Stelle, an der der Vergleich greifen muss - also einen Schritt zuvor, in dem "m" seinen Wert überhaupt erst bekommt:
(Beispielhaft)
Delphi-Quellcode:
procedure Foo;
var
  m: Double; // Real = Double in aktuellen Delphi-Versionen. Real ist ein alter Typ, den es eigentlich nur noch zur Abwärtskompatibilität gibt. Es ist i.A. besser direkt "Single" oder "Double" zu verwenden.
begin
  if Edit1.Text = 'then
    m := 0
  else
    m := StrToFloat(Edit1.Text);
  
  DoStuffWithM;
end;
StrToFloatDef() macht vereinfacht gesagt genau das: Es versucht den übergebenen Text in eine Zahl umzuwandeln. Wenn dies aus welchen Gründen auch immer nicht funktioniert (lies: Der Text ist keine bekannte/gültige Schreibweise für eine gebrochene Zahl), dann wird statt dessen der im letzten Parameter gegebene Wert zurück gegeben, und kein Fehler ausgelöst, der das Programm unterbricht wie bei StrToFloat(). Es ist daher auch allgemeiner einsetzbar als der direkte Vergleich mit "''", da auch z.B. "Hubert hat ein neues Auto" zu "0" würde. Mir war nur sehr wichtig, dir näher zu bringen was unterschiedliche Datentypen sind, und warum es wichtig ist diese möglichst genau einzuhalten, und zu erklären, warum Delphi dich hier anmeckert. (Ich halte sehr wenig vom kommentarlosen Hinschreiben fertiger Lösungen, die einem keine Chance lassen etwas dabei zu lernen.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 6. Mär 2014 um 23:22 Uhr)
  Mit Zitat antworten Zitat