Hallo Leute, ich habe folgendes Problem, vielleicht könnt ihr mir weiter helfen: Ich habe ein recht umfangreiches Mikrocontroller Projekt geschrieben, das Werte von bestimmten Sensoren per ADC + SPI ausliest und per UART an die Außenwelt verteilt. Für die Datenaufbereitung wurde ein vor allem speicherhungriges Modul geschrieben, das mit Matrizen operiert (für die Matrizen wurde ein eigener Datentyp erstellt - es handelt sich eigentlich nur um ein Array, das linear im Speicher liegt, beherrscht aber auch Matrixinversion, -multiplikation etc.). Es handelt sich dabei um einen Kalmanfilter. Die Dimensionen der Matrizen sind vorher bekannt. Im Moment ist es aber so, dass ich nur eine Instanz des Kalmanfilters benutzen kann. Die große Frage, die sich mir stellt ist: Wie kann ich beliebig viele Instanzen des Filters erstellen, mit verschiedenen Matrixdimensionen? Normalerweise würde ich aus dem 'Modul' ebenfalls per typedef einen Datentyp machen. Aber ich möchte Speicher sparen, und daher viele Zwischenergebnis-Matrizen in den einzelnen Instanzen des Filter teilen. Sprich temporäre Matrizen, die ich nicht lokal zur Laufzeit erzeuge, sondern vorher festgelegt habe, sollen in allen Instanzen gleich sein. Die Filter laufen sequentiell hintereinander und können sich gegenseitig nicht in die Quere kommen, sodass dies aus meiner Sicht kein Problem darstellen sollte, oder? Mein großes Problem ist aber definitiv die Implementation. Wie macht man sowas am geschicktesten? Danke + schöne Grüße, db
Du brauchst doch "einfach" nur nen Zeiger auf jede Matrix, den du in allen Modulen bekannt gibst.
> Wie kann ich beliebig viele Instanzen des Filters erstellen, > mit verschiedenen Matrixdimensionen? Du könntest die Frage auch anders formulieren: Wie kann ich in C objektorientiert programmieren. Zum Beispiel so: http://www.elektronikpraxis.vogel.de/themen/embeddedsoftwareengineering/implementierung/articles/252633/
> Wie kann ich beliebig viele Instanzen des Filters erstellen, mit verschiedenen
Matrixdimensionen?
Der kanonische Weg ist:
Mit einem neuen Datentyp (einer Struktur), welche Matrix samt
Dimensionen in einer Struktur vereint.
Die Berechnungsmethoden werden dann so umgearbeitet, dass sie die
Matrixdimensionen nicht mehr als Konstante im Code haben, sondern sich
aus der Struktur holen, die anstelle der bisherigen Matrix übergeben
wird.
Oder aber:
Da man ja nicht allzuviele verschiedene Dimensionswerte haben wird:
Indem man für jede benutzte Matrixgröße ein eigener Satz an Funktionen
schreibt.
Da es in C keine templates gibt, könnte man da mit Makro-Magie was
zaubern, sofern die Funktionen kurz genug sind.
1 | #define FUNC_A(x) \
|
2 | void func_##x ( int x ) \
|
3 | { \
|
4 | return 3*x; \
|
5 | }
|
6 | |
7 | |
8 | FUNC_A(2) |
9 | FUNC_A(3) |
10 | |
11 | int main() |
12 | {
|
13 | func_2( 4 ); |
14 | func_3( 5 ); |
15 | }
|
Durch das Makro wird die 'Blaupause' für eine Funktion definiert, die ein x erst bei der Makro Substitution übernimmt. Dadurch ist es möglich, dass man sich durch die Makroinstantiierungen
1 | FUNC_A(2) |
2 | FUNC_A(3) |
vom Präprozessor 2 Funktionen erzeugen lässt, wobei bei der einen Funktion anstelle des x eben 2 eingesetzt wird (auch im Funktionsnamen!) und das andere mal eine Funktion erzeugt wird, die mit einer 3 erzeugt wird. Sind die Funktionen nicht kurz genug, dann wird man diesen etwas trickreicheren Weg nicht gehen und statt dessen lieber explizite Code-Duplizierung betreiben und die paar benötigten Funktionen jeweils extra im Code schreiben, wobei man vom Preprozessor und dessen #define bzw. #undefine immer noch guten Gebrauch machen kann.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.