Forum: Compiler & IDEs modular programmieren in C


von db (Gast)


Lesenswert?

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

von Erich (Gast)


Lesenswert?

Mit 'nem zweidimensionalen Array.
Gruss

von Max (Gast)


Lesenswert?

Du brauchst doch "einfach" nur nen Zeiger auf jede Matrix, den du in 
allen Modulen bekannt gibst.

von Stefan (Gast)


Lesenswert?

> 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/

von Karl H. (kbuchegg)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.