![]() |
Werte in Array verschieben, funktioniert nicht richtig
Hallo und guten Morgen,
Hab da ein kleines Problem mit meiner eigenen Logik. Also ich habe ein Array mit Werten drin. Es kommen periodisch neue Werte hinzu (diese packe ich auf die letzte Stelle). Dafür soll der erste Wert es Arrays verschwinden. Habe das so programmiert (und denke ich hab irgendwie einen ziemlich simplen Fehler eingebaut, den ich aber irgendwie nicht sehe). Hier mal die 2 Proceduren, die ich dafür verwende:
Delphi-Quellcode:
Hab das mal versucht so gut es geht zu kommentieren, damit ihr auch meinen Gedankengang verfolgen könnt. Problem ist wie gesagt, der Gedankengang stimmt nicht mit dem Ergebnis überein. Im Ergebnis erhält der vorletzte Array Wert nie den Wert des letzten (also muss etwas in der ArrayWert-Verschiebung wohl fehl gehen).
procedure TOszilloskopKanal.movedArray(temparray: array of double);
var i: integer; begin // Das Array wird durchlaufen und es wird immer der Nachfolger auf den Vorgänger gesetzt. for i := 0 to Length(temparray)-2 do temparray[i] := temparray[i+1]; end; // Es werden immer nur die letzen Werte gesetzt procedure TOszilloskopKanal.SetYWert(dWert: double); begin // Wenn ein Wert im Eingang reinkommt, werden zuerst // die Werte im Array verschoben, movedArray(FadyWert); // dass letzte Element, was nach dem Verschieben "frei" wird (effektiv sitzt dort immer noch der gleiche Wert drin, wie vor der ArrayWert-Verschiebung, aber dieser wurde ja schon auf das Vorletzte Feld kopiert. FadyWert[FiYmax] := dWert; //FiYMax = Maximale Anzahl an Y-Werten // Und es wird nach außen signalisiert, dass etwas am Eingang geschehen ist (dies soll für das Zeichnen den Timer sparen und die Performance verbessern) doChangeEingang; end; Vielen Dank BAMatze |
Re: Werte in Array verschieben, funktioniert nicht richtig
Versuch mal
Delphi-Quellcode:
for i := Low(temparray)+1 to High(temparray) do temparray[i-1] := temparray[i];
|
Re: Werte in Array verschieben, funktioniert nicht richtig
Zitat:
|
Re: Werte in Array verschieben, funktioniert nicht richtig
Übergib den Array mal als var
|
Re: Werte in Array verschieben, funktioniert nicht richtig
Zitat:
Dank dir. |
Re: Werte in Array verschieben, funktioniert nicht richtig
geht das nicht schneller mit move?
|
Re: Werte in Array verschieben, funktioniert nicht richtig
Zitat:
|
Re: Werte in Array verschieben, funktioniert nicht richtig
Delphi-Quellcode:
procedure TOszilloskopKanal.movedArray(var temparray: array of double);
var n: integer; begin n := Length(temparray); if n > 1 then Move(temparray[1], temparray[0], (n - 2) * sizeof(temparray[0])); end; |
Re: Werte in Array verschieben, funktioniert nicht richtig
Werde ich mal testen. Danke @Uwe
|
Re: Werte in Array verschieben, funktioniert nicht richtig
Move ist wenn ich mich recht erinnere auch nur eine Schleife die byteweise umkopiert (oder verwechsel ich das gerade mit copy? :gruebel:)
Aber wie dem auch sei: Das Array ständig rumzuwerfen ist, sagen wir mal vorsichtig "klobig gedacht". Das ist ein klassischer Fall für einen Ringbuffer, der zwar auch ein Array ist, in dem aber nie etwas umkopiert wird. Statt dessen hälst du dir zusätzlichen einen Merker an welchem Index gerade der aktuellste Wert steht. Mit einer Hand voll "mod" und "Length(array)" kann man dann erreichen dass der Merker immer im Kreis läuft, und auch zum Auslesen reichen die Infos Position und Länge ja aus. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:48 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