Forum: Mikrocontroller und Digitale Elektronik Ringpuffer - Verben


von Walter T. (nicolas)


Lesenswert?

Guten Morgen,

bei einem Stapelspeicher/Stack/LIFO sind die Verben "push" und "pop" für 
das Speichern und das zerstörende Auslesen fixe Termini.

Gibt es solche fixen Termini auf für Ringpuffer/FIFO? Auf Anhieb finde 
ich nur "Enqueue" und "Dequeue", aber das liest sich komisch.

von torusle (Gast)


Lesenswert?

read und write

von Vincent H. (vinci)


Lesenswert?

Als C++ Nutzer: push_back und pop_back (bzw push_front und pop_front)

von Marten Morten (Gast)


Lesenswert?

Walter T. schrieb:
> Gibt es solche fixen Termini auf für Ringpuffer/FIFO? Auf Anhieb finde
> ich nur "Enqueue" und "Dequeue", aber das liest sich komisch.

Die Begriffe sind OK. Die kommen aus der Queue- (Warteschlangen-) 
Theorie und ein FIFO ist eine Warteschlange.

von A. S. (Gast)


Lesenswert?

Marten Morten schrieb:
> Die Begriffe sind OK. Die kommen aus der Queue- (Warteschlangen-)
> Theorie und ein FIFO ist eine Warteschlange

Nach meinem Gefühl:

Read/Write bei Bytes,
andere Begriffe nur bei "Objekten"

Oder in anderen Worten: Read/Write wenn mehrere Elemente nacheinander 
zusammen gehören.

von Axel S. (a-za-z0-9)


Lesenswert?

Perl hat push und pop für das Ende einer Liste und shift und 
unshift für den Anfang. Man könnte also push und shift verwenden.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Walter T. schrieb:
> Gibt es solche fixen Termini auf für Ringpuffer/FIFO?
Wenn ich "FIFO schreiben" und "FIFO lesen" sage, schaut mich keiner 
schräg an. Jeder weiß dann auch, dass dazu etwas mehr Handling nötig 
ist, als eine "normale" Speicherzelle/Variable zu beschreiben oder zu 
lesen.

: Bearbeitet durch Moderator
von Wilhelm M. (wimalopaan)


Lesenswert?

Vincent H. schrieb:
> Als C++ Nutzer: push_back und pop_back (bzw push_front und pop_front)

Mit push_back und pop_back (dann brauchst Du auch back()) wird es ein 
Stack ;-)

Und std::queue hat push() und pop()/front():

https://en.cppreference.com/w/cpp/container/queue

von Vincent H. (vinci)


Lesenswert?

Wilhelm M. schrieb:
> Vincent H. schrieb:
>> Als C++ Nutzer: push_back und pop_back (bzw push_front und pop_front)
>
> Mit push_back und pop_back (dann brauchst Du auch back()) wird es ein
> Stack ;-)
>
> Und std::queue hat push() und pop()/front():
>
> https://en.cppreference.com/w/cpp/container/queue


Und std::list hat push_X/pop_X ;)

https://en.cppreference.com/w/cpp/container/list

von Wilhelm M. (wimalopaan)


Lesenswert?

Vincent H. schrieb:
> Wilhelm M. schrieb:
>> Vincent H. schrieb:
>>> Als C++ Nutzer: push_back und pop_back (bzw push_front und pop_front)
>>
>> Mit push_back und pop_back (dann brauchst Du auch back()) wird es ein
>> Stack ;-)
>>
>> Und std::queue hat push() und pop()/front():
>>
>> https://en.cppreference.com/w/cpp/container/queue
>
>
> Und std::list hat push_X/pop_X ;)
>
> https://en.cppreference.com/w/cpp/container/list

Die Frage war nach einem FIFO.
Und das realisiert man in C++ mit einem Adapter statt mit einem 
Container direkt.

von Einer (Gast)


Lesenswert?

put... und get...

von Sebastian S. (amateur)


Lesenswert?

Wie wäre es mit insert bzw. remove und read ("bleibt im Puffer").

von THaala (Gast)


Lesenswert?

Bei FIFO's werden gerne die Wörter "HEAD" und "TAIL" verwendet.

z.B. RemoveHead( &elem ),
oder AddTail( *elem )...

Gruß T.

von Bork (Gast)


Lesenswert?

queuein() & queueout()

von Egon D. (Gast)


Lesenswert?

Walter T. schrieb:

> bei einem Stapelspeicher/Stack/LIFO sind die Verben
> "push" und "pop" für das Speichern und das zerstörende
> Auslesen fixe Termini.
>
> Gibt es solche fixen Termini auf für Ringpuffer/FIFO?
> Auf Anhieb finde ich nur "Enqueue" und "Dequeue", aber
> das liest sich komisch.

Naja, sowohl Stack als auch Warteschlange fasse ich als
Listen auf; der Unterschied ist nur, an welchem Ende
gelesen und geschrieben wird.

Zugriffe "am Anfang" (--> Stack) heißen bei mir wie
üblich "push" und "pop".
"Am Ende anhängen" heisst bei mir ganz simpel "append".

Für das zerstörende Lesen vom Ende fehlt mir auch noch
das Verb.

von Wilhelm M. (wimalopaan)


Lesenswert?

Egon D. schrieb:

> Naja, sowohl Stack als auch Warteschlange fasse ich als
> Listen auf; der Unterschied ist nur, an welchem Ende
> gelesen und geschrieben wird.
>

Stack, Queue, Deque  (und auch List) sind ADTs. Nicht jeder Stack ist 
als Liste implementiert, oft ist der Stack ein generischer Adapter auf 
einen sequentiellen Container (wie etwa eine verkettete Liste). Oft wird 
mit (Linked-)List auch die konkrete Implementierung eines sequentiellen 
Containers gemeint.

von c-hater (Gast)


Lesenswert?

Egon D. schrieb:

> Naja, sowohl Stack als auch Warteschlange fasse ich als
> Listen auf

Nur ein sehr dumm implementierter FIFO ist eine Liste. Der Witz eines 
FIFO ist je gerade, den Overhead einer Liste zu vermeiden.

Und: Nur ein sehr dumm implementierter Stack ist eine Liste. Der Witz 
eines Stack ist nämlich auch gerade, den Overhead einer Liste zu 
vermeiden.

Darüber schon einmal nachgedacht?

von W.S. (Gast)


Lesenswert?

Walter T. schrieb:
> Gibt es solche fixen Termini auf für Ringpuffer/FIFO?

Eigentlich nicht, denn ein FIFO ist eigentlich dafür gedacht, im stillen 
irgendwelche Zwischenspeicherungen zu erledigen, ohne dediziert für die 
aufrufenden Programme in Erscheinung zu treten.

Also sollte es bei einem Fifi in Schreibrichtung nur 2 Aufrufe geben:
bool IstNochPlatzFrei()
und
irgendwas SchreibeMeinDing(irgendwas MeinDing)

und in Leserichtung:
bool GibtEsIrgendwasZuLesen()
irgendwas GibMirWasDuHast()

Wozu sollte es da solche Begriffe wie push und pop geben? Es ist ja kein 
LiFo.

W.S.

von Egon D. (Gast)


Lesenswert?

Wilhelm M. schrieb:

> Nicht jeder Stack ist als Liste implementiert,
> [...]

Nicht einmal jede Liste ist als Liste implementiert.

Zu meinem eigentlichen Kernpunkt, dass mir für das
zerstörende Lesen vom Ende einer Deque auch das
passende schöne Verb fehlt, hast Du leider nix
gesagt.

von Wilhelm M. (wimalopaan)


Lesenswert?

Egon D. schrieb:
> Wilhelm M. schrieb:
>
>> Nicht jeder Stack ist als Liste implementiert,
>> [...]
>
> Nicht einmal jede Liste ist als Liste implementiert.
>
> Zu meinem eigentlichen Kernpunkt, dass mir für das
> zerstörende Lesen vom Ende einer Deque auch das
> passende schöne Verb fehlt, hast Du leider nix
> gesagt.

Ich halte mich an die C++ Nomenklatur.

von Egon D. (Gast)


Lesenswert?

W.S. schrieb:

> Walter T. schrieb:
>> Gibt es solche fixen Termini auf für Ringpuffer/FIFO?
>
> Eigentlich nicht, denn ein FIFO ist eigentlich dafür
> gedacht, im stillen irgendwelche Zwischenspeicherungen
> zu erledigen,

Ja.


> ohne dediziert für die aufrufenden Programme in
> Erscheinung zu treten.

Nö.


> Also sollte es bei einem Fifi in Schreibrichtung nur
> 2 Aufrufe geben:
> bool IstNochPlatzFrei()
> und
> irgendwas SchreibeMeinDing(irgendwas MeinDing)
>
> und in Leserichtung:
> bool GibtEsIrgendwasZuLesen()
> irgendwas GibMirWasDuHast()


Auch nicht.

Konkretes Beispiel: Mein in Tcl implementiertes Linux-
Installationstool behandelt reale Pakete (die direkt
von anderen Paketen abhängen) und virtuelle Pakete
(deren Behandlung deutlich komplizierter ist) unter-
schiedlich: Reale Pakete werden mit "push" auf den
"Stapel" gelegt und mit "pop" gelesen. Die Behandlung
virtueller Pakete wird solange verzögert, bis alle
realen Pakete bearbeitet wurden, was ganz einfach
dadurch erreicht wird, dass die virtuellen Pakete
mittels "append" hinten an die "Warteschlange"
angefügt werden.

Unnötig zu erwähnen, dass der "Stapel" und die
"Warteschlange" mittels ein und derselben "Deque"
implementiert sind.


> Wozu sollte es da solche Begriffe wie push und pop
> geben? Es ist ja kein LiFo.

Weil diese strikte Unterscheidung sinnlos ist. Eine
"Deque" kann als Stapel oder als Warteschlange verwendet
werden , und zwar auch dieselbe Deque im selben Programm
mal so und mal so.

von Egon D. (Gast)


Lesenswert?

Wilhelm M. schrieb:

> Egon D. schrieb:
>> Wilhelm M. schrieb:
>>
>>> Nicht jeder Stack ist als Liste implementiert,
>>> [...]
>>
>> Nicht einmal jede Liste ist als Liste implementiert.
>>
>> Zu meinem eigentlichen Kernpunkt, dass mir für das
>> zerstörende Lesen vom Ende einer Deque auch das
>> passende schöne Verb fehlt, hast Du leider nix
>> gesagt.
>
> Ich halte mich an die C++ Nomenklatur.

Und ich bin Tcl-sozialisiert.

von Rolf M. (rmagnus)


Lesenswert?

THaala schrieb:
> Bei FIFO's werden gerne die Wörter "HEAD" und "TAIL" verwendet.
>
> z.B. RemoveHead( &elem ),
> oder AddTail( *elem )...

Ich stelle mir diese Operationen gerade beim Tierarzt vor…

von Dr. Sommer (Gast)


Lesenswert?

W.S. schrieb:
> irgendwas SchreibeMeinDing(irgendwas MeinDing)
>
> und in

Und SchreibeMeinDing ist jetzt besser als push oder write weil?

W.S. schrieb:
> ohne dediziert für die aufrufenden Programme in Erscheinung zu treten.

Eine unsichtbare Komponente kann nicht genutzt werden und ist daher 
sinnlos. Irgend ein API muss es haben.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

W.S. schrieb:
> Walter T. schrieb:
>> Gibt es solche fixen Termini auf für Ringpuffer/FIFO?
>
> Eigentlich nicht, denn ein FIFO ist eigentlich dafür gedacht, im stillen
> irgendwelche Zwischenspeicherungen zu erledigen, ohne dediziert für die
> aufrufenden Programme in Erscheinung zu treten.

Was fürn Quatsch mit Souce!
Das mag vllt bei so einigen embeddet UART Lösungen so sein wo eine FIFO 
fest in den Treiber genagelt ist für unblockierendes IRQ senden.
Da haste dann nur dein putc/puts und gut.

Aber sobald man mal ordentlich programmiert sind FIFOs auch dediziert 
vorhanden.

zB in Form einer OS FIFO um zwischen mehreren Tasks Daten/Aufgaben zu 
verteilen.

Da kommen wir jetzt wieder zum Thema, FreeRTOS hat da ja auch Namen für, 
die hab ich dann einfach übernommen:
https://www.freertos.org/a00018.html
-SendToBack
-SendToFront
-Receive (zerstörendes lesen)
-Peek (lesen ohne zerstören)

von Rainer V. (a_zip)


Lesenswert?

c-hater schrieb:
> Nur ein sehr dumm implementierter FIFO ist eine Liste. Der Witz eines
> FIFO ist je gerade, den Overhead einer Liste zu vermeiden.

Ich denke, dass du gerade nur zur Hälfte Recht hast. Natürlich ist auch 
ein FIFO oder ein Stack eine Liste, allerdings eine sehr simple. Je mehr 
Methoden du für diese Liste hast/definierst, um so größer wird natürlich 
der Overhead. Ob man also ein FIFO, mit dem man "alles Mögliche" 
anstellen kann - also hinten/vorne, zerstörungsfrei oder nicht, lesen 
und was sonst noch - so noch nennen wird, ist eine andere Frage...für 
mich zumindest fraglich...
Gruß Rainer

von c-hater (Gast)


Lesenswert?

Rainer V. schrieb:

> Natürlich ist auch
> ein FIFO oder ein Stack eine Liste, allerdings eine sehr simple.

Das siehst du falsch. Es sind eben keine Listen, weil sie nur spezielle 
Zugriffsmuster implementieren und nicht das allgemeine Listeninterface.

Und der Sinn darin, eben nur diese speziellen Zugriffsmuster abzubilden, 
ist, dass die Beschränkung darauf das Konstrukt (ggf. um ein 
Vielfaches!) effizienter machen kann.

Der Gewinn entsteht dabei nicht dadurch, dass Zugriffsmethoden 
entfallen, sondern dadurch, dass die interne Verwaltung des Speichers 
effizienter umgesetzt werden kann. Das entfallen der 
Listen-Zugriffsmethoden ist dann nur die FOLGE. Sie lassen sich mit 
der auf Effizienz für die speziellen Zugriffsmuster getrimmten internen 
Datenverwaltung schlicht nicht realisieren.

Genau, weil das alles so ist, wie es ist, ist es auch dumm, einer 
generischen Liste die passenden Zugriffsmethoden für FIFO oder Stack zu 
verpassen, den Rest zu verstecken und ansonsten alles beizubehalten.

Das macht nichts effizienter, beschränkt nur unnütz die Möglichkeiten. 
Da bleibt man dann besser einfach bei der Liste und setzt das 
Zugriffsmuster mit mit deren Methoden um.

von Bernd K. (prof7bit)


Lesenswert?

Egon D. schrieb:
> "Am Ende anhängen"

Da gehts schon los: Was ist das "Ende", wo ist "vorne", von welchem Ende 
aus muss mans betrachten damit das Sinn ergibt?

Für mich hat eine Queue konzeptionell erstmal nur "rein" und "raus". Ich 
persönlich favorisiere put() und get() für die Grundfunktionen der 
Queue.

von Egon D. (Gast)


Lesenswert?

Bernd K. schrieb:

> Egon D. schrieb:
>> "Am Ende anhängen"
>
> Da gehts schon los: Was ist das "Ende", wo ist
> "vorne", von welchem Ende aus muss mans betrachten
> damit das Sinn ergibt?

Das ist egal.
Entscheidend ist nur: "Push" und "Pop" wirken auf
dasselbe Ende, "Append" und "Pop" aber auf verschiedene.
Welches Ende Du Dir "vorn" oder "hinten" vorstellst,
ist völlig egal.

Womit auch offenkundig wird, dass ich die ganze Zeit
ein Brett vor dem Kopf hatte: Man braucht überhaupt
keinen vierten Begriff.


> Für mich hat eine Queue konzeptionell erstmal nur
> "rein" und "raus". Ich persönlich favorisiere put()
> und get() für die Grundfunktionen der Queue.

Das verstehe ich.

Auf der anderen Seite bin ich aber ein Freund der
"verständigen Abstraktion": Wenn sich Dinge
konzeptionell dermaßen ähnlich sind wie ein Stack,
eine Warteschlange und eine Deque, dann bevorzuge
ich es aus Gründen des erreichten Lebensalters und
der Faulheit, mir nur EIN Ding merken zu müssen und
die anderen daraus ableiten zu können.

Eine Deque mit den Operationen "push", "pop" und
"append" leistet für mich das Gewünschte. Aber
natürlich muss niemand meiner Sichtweise folgen.

von Egon D. (Gast)


Lesenswert?

c-hater schrieb:

> Rainer V. schrieb:
>
>> Natürlich ist auch
>> ein FIFO oder ein Stack eine Liste, allerdings
>> eine sehr simple.
>
> Das siehst du falsch. Es sind eben keine Listen,
> weil sie nur spezielle Zugriffsmuster implementieren
> und nicht das allgemeine Listeninterface.

Das siehst Du falsch. Ein dreibeiniger Hund oder ein
Auto ohne Dach ist auch ein Hund bzw. ein Auto, obwohl
sie nicht das allgemeine Hunde- bzw. Auto-Interface
implementieren.

Die Welt richtet sich glücklicherweise nicht nach
von Dir frei erfundenen Forderungen.


> Und der Sinn darin, eben nur diese speziellen
> Zugriffsmuster abzubilden, ist, dass die Beschränkung
> darauf das Konstrukt (ggf. um ein Vielfaches!)
> effizienter machen kann.

Unsinn.
Der Sinn, das Zugriffsmuster eines Stacks abzubilden,
liegt darin, dass mein Algorithmus auf einem Stack
basiert.

von Rainer V. (a_zip)


Lesenswert?

Egon D. schrieb:
> Das siehst Du falsch. Ein dreibeiniger Hund oder ein
> Auto ohne Dach ist auch ein Hund bzw. ein Auto, obwohl
> sie nicht das allgemeine Hunde- bzw. Auto-Interface
> implementieren.

Sorry, Quark, wie immer...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.