Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Werte in Array verschieben, funktioniert nicht richtig (https://www.delphipraxis.net/138533-werte-array-verschieben-funktioniert-nicht-richtig.html)

BAMatze 12. Aug 2009 07:39


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:
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;
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).

Vielen Dank
BAMatze

mkinzler 12. Aug 2009 07:42

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];

BAMatze 12. Aug 2009 07:45

Re: Werte in Array verschieben, funktioniert nicht richtig
 
Zitat:

Zitat von mkinzler
Versuch mal
Delphi-Quellcode:
for i := Low(temparray)+1 to High(temparray) do temparray[i-1] := temparray[i];

Nein leider keine Änderung. :(

mkinzler 12. Aug 2009 07:47

Re: Werte in Array verschieben, funktioniert nicht richtig
 
Übergib den Array mal als var

BAMatze 12. Aug 2009 07:50

Re: Werte in Array verschieben, funktioniert nicht richtig
 
Zitat:

Zitat von mkinzler
Übergib den Array mal als var

:wall: :wall: :wall: wie ich schon schrieb, ziemlich dummer Fehler :? :dp:

Dank dir.

sirius 12. Aug 2009 07:54

Re: Werte in Array verschieben, funktioniert nicht richtig
 
geht das nicht schneller mit move?

BAMatze 12. Aug 2009 08:45

Re: Werte in Array verschieben, funktioniert nicht richtig
 
Zitat:

Zitat von sirius
geht das nicht schneller mit move?

Hmm da musst du mir mal einen Hinweis geben, kenne den Befehl erstmal so nicht.

Uwe Raabe 12. Aug 2009 09:30

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;

BAMatze 12. Aug 2009 09:41

Re: Werte in Array verschieben, funktioniert nicht richtig
 
Werde ich mal testen. Danke @Uwe

Medium 12. Aug 2009 13:11

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 04:14 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz