queue mit c für alle datentypen

OP #5085363
Lesenswert?

Hallo meine lieben,

ich suche einfach Möglichkeit eine queue in meinem AVR einzubauen.

Wie der Name schon sagt soll das am besten für alles gehen.
Egal ob int oder float oder ein struct.

Kennt ihr da was gutes ?

Mann könnte sie ja selber schreiben ... wäre aber mühselig für jeden 
Datentyp
und Templates gehen in c leider nicht :(

MFG Matthias
Gast #5085384
Lesenswert?

Matthias T. schrieb:
> und Templates gehen in c leider nicht

Was spricht dagegen, einfach den C++-Compiler zu nehmen?
Der schluckt auch fast alles an normalen "C", und richtig eingesetzt 
erzeugen Templates da keinen Overhead gegenüber C.

Peter II schrieb:
> einfach Zeiger verwenden schon hast du nur einen Datentyp.

Halte ich für ungünstig.

Matthias T. schrieb:
> Egal ob int oder float oder ein struct

wenn du dann int* speicherst, hast du > 100% Overhead. Und brauchst 
zwingend dynamische Speicherverwaltung.

Dann lieber einen Satz Macros, um einen Ringbuffer in einem statischen 
int, float, struct X - Array zu verwalten.
Gast #5085390
Lesenswert?

AntiMaker schrieb:
> Was spricht dagegen, einfach den C++-Compiler zu nehmen?
> Der schluckt auch fast alles an normalen "C", und richtig eingesetzt
> erzeugen Templates da keinen Overhead gegenüber C.

dann schau dir mal die Programmgrößen von 4 Queue mit unterschiedlichen 
Datentypen an. Die Programm werden sehr groß, weil für jeden Datentype 
alle Funktionen erstellt werden. Das ist zwar kein Overhead weil man das 
gleiche mit C auch machen müsste, aber beim arbeiten mit Zeigern fällt 
das alles weg. Dafür hat man keine Typsicherheit mehr.
OP #5085405
Lesenswert?

Hast Recht, Ram ist aber auch da um benutzt zu werden, stellt sich die 
Frage was ist günstiger, etwas Ram für den Zeiger, oder die Daten in die 
queue rein und raus zu kopieren.

Ich will sie eigentlich auch auf eine Länge von 10-20 Elementen 
beschränken, also wäre der maximalbedarf sogar berechenbar und gedeckelt

MFG
Matthias
Gast #5085409
Lesenswert?

Peter D. schrieb:
> Man kann sich die Queue doch als Header schreiben und mit typedef den
> Typ der Variablen zuweisen.

nein, weil man beim zweiten typedef die gleichen Funktionsnamen hat. Da 
müsste man schon etwas mehr Makros verwenden.

Selbst wenn er C++ mit Templates machen würde, hätte er mehrere Queue's. 
Die Frage ist ob das überhaut gewollt ist, oder ob alles in eine queue 
rein soll.
#5085470
Lesenswert?

Matthias T. schrieb:
> ich suche einfach Möglichkeit eine queue in meinem AVR einzubauen.
>
> Wie der Name schon sagt soll das am besten für alles gehen.
> Egal ob int oder float oder ein struct.

Klassischer (byteweiser) Ringpuffer (FIFO) mit Zugriffsfunktionen für 
variable Länge, fertich. Gelesen und geschrieben wird immer 
Byte-für-Byte.

Im Falle Schreiber in main() - Leser im Interrupt muss man allerdings 
aufpassen, d.h. den Schreibzeiger erst beim abgeschlossenem 
Schreibvorgang aktualisieren oder im Interrupt den Pufferfüllstand vorm 
Lesen prüfen.
Gast #5085480
Lesenswert?

Wenn es Dir darum geht, dass Queue und Elemente (bzw. deren Zugriff) 
Typsicher sind, dann must Du entsprechende Typen (bzw Funktionen) 
definieren.

Der Mechanismus kann dann generell sein, für jeden Typ kommen ein paar 
Zeilen hinzu. Der "Overhead" beschränkt sich auf vielleicht 10 Zeilen 
pro Typ. Mehr Laufzeit oder Platz muss es (dank Inline) nicht kosten.

Zeige einfach Deinen Code mit einem typen, und ich baue es Dir gerne auf 
4 Typen um, ohne nennenswerte Kollarteralschäden.
Gast #5085576
Lesenswert?

Wenn du es in C machen willst, gibts eigentlich nur den weg über void 
pointer.
Kannst dir als Beispiel ja mal den C qsort anschauen, wie der definiert 
ist:
http://en.cppreference.com/w/c/algorithm/qsort

Du musst halt auf alle Fälle auch immer die size eines einzelnen 
Elements mitübergeben und damit arbeiten. Geht halt nicht anders in C...
Ist aber nicht schlimm, es gibt genug Programme in denen das gemacht 
wird, muss man halt nur sauber programmieren und testen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren