AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FIFO-Array, gibt es soetwas?

Ein Thema von Alter Mann · begonnen am 15. Mär 2013 · letzter Beitrag vom 16. Mär 2013
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
947 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

FIFO-Array, gibt es soetwas?

  Alt 15. Mär 2013, 20:32
Hallo,

ich habe ein kleines Problem: Ich brauche eine sehr schnelle Möglichkeit Bytes
innerhalb eines Array zu verschieben. So etwas wie:
Delphi-Quellcode:
procedure AddByte(aByte : Byte; Dest : TByteArray);
var
  I : WORD;
begin
  for I := Low(Dest) to High(Dest) -1 do
   Dest[I] := Dest[I+1];
  Dest[High(Dest)] := aByte;
end;
Gibt es da etwas?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: FIFO-Array, gibt es soetwas?

  Alt 15. Mär 2013, 22:48
Mach es doch umgekehrt, eine Anfangsadresse, eine Endadresse (16Byte). Da mußt Du nichts verschieben (DOS.Keyboard queue)

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.077 Beiträge
 
Delphi XE2 Professional
 
#3

AW: FIFO-Array, gibt es soetwas?

  Alt 15. Mär 2013, 22:54
Hallo,

ich habe ein kleines Problem: Ich brauche eine sehr schnelle Möglichkeit Bytes
innerhalb eines Array zu verschieben. So etwas wie:
Delphi-Quellcode:
procedure AddByte(aByte : Byte; Dest : TByteArray);
var
  I : WORD;
begin
  for I := Low(Dest) to High(Dest) -1 do
   Dest[I] := Dest[I+1];
  Dest[High(Dest)] := aByte;
end;
Gibt es da etwas?
Danke
Vielleicht so? (nicht getestet)
Delphi-Quellcode:
procedure AddByte(aByte : Byte; Dest : TByteArray);
begin
   Move(Dest[Low(Dest)+1], Dest[Low(dest)], High(dest)-Low(Dest));
   Dest[High(Dest)] := aByte;
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#4

AW: FIFO-Array, gibt es soetwas?

  Alt 15. Mär 2013, 23:02
Falls du immernoch an der Suche dran bist, kuck dir mal deinen ursprünglichen Thread an.
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: FIFO-Array, gibt es soetwas?

  Alt 15. Mär 2013, 23:25
Mach es doch umgekehrt, eine Anfangsadresse, eine Endadresse (16Byte). Da mußt Du nichts verschieben (DOS.Keyboard queue)
p80286 hat recht: Ein Ringbuffer löst dein Problem viel besser als ein einfaches Array.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#6

AW: FIFO-Array, gibt es soetwas?

  Alt 15. Mär 2013, 23:33
Wenn es wichtig ist, dass alles in einem Block direkt hintereinander im Speicher liegt (bei Ringbuffer nicht gegeben), fiele mir folgendes ein:
Code:
Anfangszustand (FIFO-Array mit Länge 4):
  Äußerer Puffer: |[1][2][3][4][ ][ ][ ][ ][ ][ ][ ][ ]|
  FIFO-Array:      [1][2][3][4]

5 wird hinten ans FIFO-Array angefügt:
  Äußerer Puffer: |[1][2][3][4][5][ ][ ][ ][ ][ ][ ][ ]|
  FIFO-Array:         [2][3][4][5]

6 wird hinten ans FIFO-Array angefügt:
  Äußerer Puffer: |[1][2][3][4][5][6][ ][ ][ ][ ][ ][ ]|
  FIFO-Array:            [3][4][5][6]

...

12 wird hinten ans FIFO-Array angefügt:
  Äußerer Puffer: |[1][2][3][4][5][6][7][8][9][10][11][12]|
  FIFO-Array:                              [9][10][11][12]

Wenn jetzt noch was angefügt wird, dann müssen wir zuerst
einmalig die hintersten vier Stellen nach vorne kopieren:
  Äußerer Puffer: |[9][10][11][12][5][6][7][8][9][10][11][12]|
  FIFO-Array:      [9][10][11][12]

13 wird hinten ans FIFO-Array angefügt:
  Äußerer Puffer: |[9][10][11][12][13][6][7][8][9][10][11][12]|
  FIFO-Array:         [10][11][12][13]  

...
Das reduziert die Anzahl der Kopiervorgänge, wenn der äußere Buffer entsprechend groß ist, erheblich.
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#7

AW: FIFO-Array, gibt es soetwas?

  Alt 16. Mär 2013, 12:10
Hübsch.
Mir fällt bei Queue immer eine linked list ein. Ohne groß nachzudenken, müsste eine einfachverkettete Liste ausreichen.

Aber die Problemstellung ist hier eine andere (hab den anderen Thread gelesen),
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: FIFO-Array, gibt es soetwas?

  Alt 16. Mär 2013, 13:11
Also ich würde mal überlegen, ob nicht eine Double-Ended-Queue alle Wünsche erfüllen kann.
Intern würde man die Dequeue als Ringspeicher mit einem dynamischen Array organisieren.
Es gibt einen "Top" und "Bottom"-Index mit denen man jeweils das obere und untere Ende der Queue markiert.
Sollte der Ringpuffer überlaufen, weil der Top-Index den Bottom-Index überholt, wird der Ringpuffer in der Grösse verdoppelt und die Daten kopiert.

Es gibt folgende Methoden:
PUSH und POP für das Einfügen oder Entnehmen eines Elements am hinteren Ende der Deque.
PUT und GET für das Einfügen oder Entnehmen am vorderen Ende der Deque.
FIRST und LAST für das Lesen des ersten oder letzten Elementes, ohne es zu entfernen.
Auuserdem gibt es noch das Property Count für den aktuellen Füllstand und das Property Capacity für die Grösse des Ringpuffers.

Damit das für Bytes noch etwas effizienter wird, kann man bei den Methoden Pop und Get noch die Anzahl der Bytes mitgeben, die man auslesen möchte.

Das wäre doch mal eine schöne Herausforderung für Delphiprogrammierer mit fortgeschrittenen Kenntnissen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:45 Uhr.
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