Nabend Community,
ich habe ein Array dessen Größe zur Kompilierung schon fest steht.
Ist es möglich das dem Kompiler mitzuteilen? Aktuell schmeißt er
berechtigte Fehler "initialization of flexible array member in a nested
context".
Es geht um "*pTim[]"
Das geht so nicht, weil jeder Eintrag des äußeren Arrays (sTimIRQnCfg)
gleich groß sein muss; daher können die einzelnen
TIMER_Irq_Cfg_t-Instanzen nicht unterschiedlich lange Arrays beinhalten.
Du musst jedes der Timer-Arrays als separate Variable anlegen und
Pointer darauf verwenden. Eventuell lässt sich mit Makros & Statement
Expressions (nur GCC) oder in C++ mit Lambdas etwas frickeln um das
abzukürzen.
Hallo,
da alles gleich groß sein muss, könnte man es mit Platzhalter auffüllen.
Meistens mit 0 oder dem größten Wert des Wertebereiches. Hier mit
Zeigern in C würde ich es mit NULL auffüllen. Sollte doch gehen?
Ich weiß nicht ob das in C im struct auch geht, Größe einfach festlegen.
Veit D. schrieb:> Hallo,>> da alles gleich groß sein muss, könnte man es mit Platzhalter auffüllen.> Meistens mit 0 oder dem größten Wert des Wertebereiches. Hier mit> Zeigern in C würde ich es mit NULL auffüllen. Sollte doch gehen?>> Ich weiß nicht ob das in C im struct auch geht, Größe einfach> festlegen.TIM_TypeDef *pTim[7];
Ja das funktioniert. Nur werden da viele nützliche Bytes verschwendet,
die an anderer Stelle mal fehlen könnten.
> Nur werden da viele nützliche Bytes verschwendet,
Bei meinem Vorschlag auch. Für *pTim baut der Compiler einen
zusätzlichen Pointer in die Struct ein. Eventuell brauchen die Pointer
mehr Bytes als das pTim[7]. Und möglicherweise erzeugt der Compiler für
den Zugriff über einen zusätzlichen Pointer auch noch zusätzlichen
Maschinencode.
Ich habe gerade ein Problem beim Zugriff auf die Liste..
Musste das ganze mal bei pastebin.com Posten da hier die Formatierung
nicht ganz passte (ja ich bin zu faul das hier alles zurecht zurücken)..
https://pastebin.com/MmiByfiW
Er greift auf die einzelnen Inhalte von TimList0..7[] nicht zu in Zeile
30.
Hallo,
bau einmal serielle Debugausgaben ein. Zum Bsp. für Irq und
sTimIRQnCfg[i].IRQn um den Vergleich zu überprüfen ob der überhaupt
gültig werden kann. Ich vermute ein Problem mit der Zeiger
Dereferenzierung bzw. fehlender dieser, weil die TIMs sind doch
Registeradressen? Nicht das es eine Verwechslung mit Adresse und
Addressinhalt gibt. Kann auch die Parameterübergabe sein ... . Wie man
es macht wird es verschiedene Möglichkeiten geben, es muss nur
einheitlich sein. Soviel zu meiner Vermutung.
Veit D. schrieb:> Hallo,>> bau einmal serielle Debugausgaben ein. Zum Bsp. für Irq und> sTimIRQnCfg[i].IRQn um den Vergleich zu überprüfen ob der überhaupt> gültig werden kann. Ich vermute ein Problem mit der Zeiger> Dereferenzierung bzw. fehlender dieser, weil die TIMs sind doch> Registeradressen? Nicht das es eine Verwechslung mit Adresse und> Addressinhalt gibt. Kann auch die Parameterübergabe sein ... . Wie man> es macht wird es verschiedene Möglichkeiten geben, es muss nur> einheitlich sein. Soviel zu meiner Vermutung.
Das habe ich schon gemacht mit dem CubeIDE Debugger.
Wenn ich das richtig interpretiere greift er auf die Listen[0..7] aber
auf deren Inhalte nicht. Anbei mal ein Foto.
Ehm, dass du bei "( TIM_TypeDef* )TimList7" casten musst ist doch sehr
verdächtig - da ist was faul!
Wenn du es genau wie in
Noch ein Kommentar schrieb:> Sollte mit zusätzlichen statischen Variablen klappen.
geschrieben machst, brauchst du keinen Cast. Bei "if ( pTim ==
sTimIRQnCfg[Index].pTim + IndexTimList )" brauchst du auch keinen.
Insbesondere musst du pTim als gewöhnlichen Pointer definieren:
Programmierer schrieb:> Ehm, dass du bei "( TIM_TypeDef* )TimList7" casten musst ist doch> sehr> verdächtig - da ist was faul!>> Wenn du es genau wie in>> Noch ein Kommentar schrieb:>> Sollte mit zusätzlichen statischen Variablen klappen.>> geschrieben machst, brauchst du keinen Cast. Bei "if ( pTim ==> sTimIRQnCfg[Index].pTim + IndexTimList )" brauchst du auch keinen.>> Insbesondere musst du pTim als gewöhnlichen Pointer definieren:typedef> struct> {> TIM_TypeDef *pTim;> } TIMER_Irq_Cfg_t;
Habe ich ja gemacht. Wenn ich das so mache..
https://pastebin.com/VX86fb5n
Wirft er mir: "(near initialization for 'sTimIRQnCfg[1].pTim')"
Ach jetzt hab ich mich selber durcheinander gebracht, die Tiger sind ja
Pointer... Versuch es mit "struct { TIM_TypeDef **pTim; }". Casts
sollten da jedenfalls nirgendwo sein.
Jan H. schrieb:> (near initialization for 'sTimIRQnCfg[1].pTim')"
Das ist übrigens nur ein kleiner Fetzen der eigentlich Fehlermeldung.
Programmierer schrieb:> Ach jetzt hab ich mich selber durcheinander gebracht, die Tiger> sind ja> Pointer... Versuch es mit "struct { TIM_TypeDef **pTim; }". Casts> sollten da jedenfalls nirgendwo sein.>> Jan H. schrieb:>> (near initialization for 'sTimIRQnCfg[1].pTim')">> Das ist übrigens nur ein kleiner Fetzen der eigentlich Fehlermeldung.
Du hast Recht. Es muss ja ein "Zeiger auf den Zeiger sein".
Danke! Funzt.
Jan H. schrieb:>>>> Du hast Recht. Es muss ja ein "Zeiger auf den Zeiger sein", war doch so> oder?
Ja genau.
Jan H. schrieb:> Wie wird dieser gleich noch referenziert?
Der äußere Zeiger muss in der schleife dereferenziert werden. Mir fällt
gerade auf dass die auch angepasst werden muss. Bin noch nicht ganz wach
🤦♂️:
1
if(pTim==sTimIRQnCfg[Index].pTim[IndexTimList])
Der innere Zeiger wird überhaupt nicht dereferenziert, nur verglichen.
Programmierer schrieb:> Jan H. schrieb:>>>>>>> Du hast Recht. Es muss ja ein "Zeiger auf den Zeiger sein", war doch so>> oder?>> Ja genau.>> Jan H. schrieb:>> Wie wird dieser gleich noch referenziert?>> Der äußere Zeiger muss in der schleife dereferenziert werden. Mir fällt> gerade auf dass die auch angepasst werden muss. Bin noch nicht ganz wach> 🤦♂️:> if ( pTim == sTimIRQnCfg[Index].pTim[ IndexTimList])>> Der innere Zeiger wird überhaupt nicht dereferenziert, nur verglichen.
Alles gut ist ja auch Montag :D
Ich habe ihn schon dereferenziert ;).