[gelöst] Daten in TChart hinzufügen

Für Fragen von Einsteigern und Programmieranfängern...
Scurra
Beiträge: 29
Registriert: Mi 31. Dez 2014, 12:08

Re: Daten in TChart hinzufügen

Beitrag von Scurra »

Danke für die ganzen Hinweise. Als Neuling in Delphi bin ich froh, wenn ich solche Anmerkungen bekomme.
auch die obere Grenze, High(ChartArray)-1, erscheint mir falsch: warum -1? Die Schleife muss doch nur alle Werte im ChartArray durchlaufen, und das geht von 0 bis High(ChartArray) (oder Length(ChartArray)-1).
Und was soll "min := ChartArray[High(ChartArray)]"? "min" und "High" erscheint mir ein Widerspruch...
Das hängt von meiner Implementierung ab. Das Problem, das ich habe, besteht darin, dass ich die Funktion "evaluate" verwende, um ein Array zu bekommen, mit dem ich mein TBarSeries füllen kann. Jedoch kenne ich den minimalen x-Wert nicht (dieser ergibt sich erst in der Funktion evaluate). Den Wert muss ich aber kennen (auch außerhalb der Funktion), um die Daten zu füllen. Das letzte Element des Arrays enthält den Minimalen x-Wert, die y-Werte sind in den vorigen Elementen gespeichert. Evtl. wäre es sinnvoller gewesen, ein record als Rückgabewert der Funktion evaluate zu verwenden und zwar mit zwei Variablen: Einem Array, das die y-Werte speichert und einem Double, das den Minimalen x-Wert angibt.
Dieses Beispiel zeigt zumindest, dass es wichtig ist, Programme immer gut zu dokumentieren. Dass ich das nicht gemacht habe, liegt einfach daran, dass ich nicht geplant habe, jemand anderem mein Programm zu zeigen.
Das "begin" vor dem abschließenden "end." ist ungewöhnlich und habe ich in Units noch nie gesehen
Da das Programm unabhängig davon läuft, ob ich dort ein begin habe oder nicht und ich auch nicht wusste, was üblich oder unüblich ist, habe ich dort ein begin hingesetzt, da sonst die Anzahl von begin und end im Dokument unterschiedlich sind, was mir eher falsch erschien. Aber ich werde es mir merken.
Du wiederholst den ersten Wert der Schleifen-Variablen vor der Schleife: "i:=1; for i:=1 to ..." Das ist unnötig.
Ich habe zuvor mit dem Debugger festgestellt, dass die Schleifen-Variable einen zufälligen Wert annahm, als ich sie nicht zuvor inizialisiert hatte, weshalb ich dachte, ich brauche es. Aber wie ich inzwischen herausgefunden habe, lag das an einem anderen Fehler im Code.
Ach ja noch: Du erleichterst den Leuten hier im Forum, die deinen Code prüfen wollen, die Arbeit, indem du von dem kompletten Projekt die .lpi, .lpr, .pas und .lfm-Dateien in ein zip-Archiv packst und dieses hochlädst. Die zip-Endung wird von der Forums-Software akzeptiert. Dann kann man gleich loslegen und muss nicht erst ein Projekt erzeugen. Und auch in den lpr/lpi-Dateien können Fehler stecken.
Ich werde es mir merken.

Jedenfalls nochmals vielen Dank für deine Hilfe und deine Kommentare/Anmerkungen. Ich werde morgen mal testen, ob das Problem verschwindet, wenn ich die Arrays jeweils mit index = 0 beginnen lasse.

wp_xyz
Beiträge: 5274
Registriert: Fr 8. Apr 2011, 09:01

Re: Daten in TChart hinzufügen

Beitrag von wp_xyz »

Das Problem, das ich habe, besteht darin, dass ich die Funktion "evaluate" verwende, um ein Array zu bekommen, mit dem ich mein TBarSeries füllen kann. Jedoch kenne ich den minimalen x-Wert nicht (dieser ergibt sich erst in der Funktion evaluate). Den Wert muss ich aber kennen (auch außerhalb der Funktion), um die Daten zu füllen. Das letzte Element des Arrays enthält den Minimalen x-Wert, die y-Werte sind in den vorigen Elementen gespeichert.
Du kannst mit var- oder out-Parametern zusätzliche Werte an die aufrufende Prozedur zurückgeben. So könnte es auch gehen, und es wäre nicht nur klarer, sondern auch wesentlich weniger fehleranfällig, als das "min" mit ins Array zu packen:

Code: Alles auswählen

 function evaluate(const k: Integer; const exp: Integer; const INTERVAL: Double; out min,max: Double): TDoubleArray;
Ich habe zuvor mit dem Debugger festgestellt, dass die Schleifen-Variable einen zufälligen Wert annahm, als ich sie nicht zuvor inizialisiert hatte, weshalb ich dachte, ich brauche es.
Nein, das brauchst du nicht, die Schleifen-Variable erhält automatisch mit dem Beginn der for-Schleife ihren ersten Wert. Erst nach dem "for" kannst du einen sinnvollen Wert der Schleifenvariablen im Debugger sehen. Vielleicht verwechselst du das mit einer "while" oder "repeat"-Schleife, bei denen man die Lauf-Variable vor dem "while"/"repeat" initialisieren muss.

Noch einen Hinweis - ist mir gerade aufgefallen: In der "Evaluate"-Funktion verwendest du "round(random(100))" - hier ist das "round" nicht nötig, weil "random" schon Ganzzahlen liefert, wenn eine Obergrenze verwendet wird, also bei "random(100)". Dann liegen die Integers zwischen 0 und der Obergrenze (wobei die 0 im Gegensatz zur Obergrenze im Datensatz enthalten sein kann). Nur wenn du "random" ohne Parameter aufrufst, werden Gleitkommazahlen zurückgegeben, die dann zwischen 0 und 1 liegen. Wenn du zufällige Gleitkommazahlen zwischen einer Unter- und einer Obergrenze benötigst, musst du das Interval [0..1) so strecken, dass 0 zur Untergrenze (MIN) und 1 zur Obergrenze (MAX) wird, also "MIN + (MAX-MIN)*random".

Scurra
Beiträge: 29
Registriert: Mi 31. Dez 2014, 12:08

Re: Daten in TChart hinzufügen

Beitrag von Scurra »

Ich habe jetzt die Indices der Arrays alle von 0 beginnen lassen und das Programm funktioniert jetzt fast fehlerfrei. Für exp = 2 tritt der Fehler nach wie vor auf. Aber ich werde selbst versuchen, den Fehler zu finden. Ich würde vermuten, dass es nach wie vor etwas mit den Arrays zu tun hat. Evtl. tritt das Problem sogar irgendwo wegen meiner Rückgabe des Minimalwerts "min" im Array auf.

Antworten