Hi
Ich verstehe gerade überhaupt nicht, warum da ein Fehler auftritt.
Es ist wie es aussieht ein Typenkonflikt, aber ich sehe den Fehler
nicht.
Es handelt sich um STM32F0
Ich habe in einem h-file xxx definiert:
Rufus Τ. F. schrieb:> Mach doch mal den Textersatz, den der Präprozessor macht:>> configureGPIO(TSC_LS2_SAMPLE.pin, TSC_LS2_SAMPLE.port, ...)>> // wird im ersten Schritt zu>> configureGPIO({TSC_GROUP_PORT.tscGroup1,GPIO_PIN_2}.pin,> {TSC_GROUP_PORT.tscGroup1,GPIO_PIN_2}.port, ...)>> Das schluckt kein C-Compiler.
Ok, und weshalb funktioniert Folgendes? :
Fragender schrieb:> typedef struct tscGroupPort{> GPIO_TypeDef* tscGroup1,> tscGroup2,> tscGroup3,> tscGroup4,> tscGroup5,> tscGroup6;> }tscGroupPorts_t;
Du hast 2 Möglichkeiten, das zu fixen:
A) Du schreibst vor jeden Struct Member explizit den Typ hin und
schließt die Zeilen mit Semikolon statt Komma ab.
B) Du wiederholst den Stern in jeder Zeile, damit tscGroup2 usw. auch
wirklich Pointer sind - so wie Du es auch für tscGroup1 vorgesehen hast.
Ein oft gemachter Fehler, wie z.B.
1
intmain()
2
{
3
int*a,b,c;
4
}
a ist dann ein Pointer, b und c sind aber keine.
So etwas passiert, wenn man alles möglichst knapp formulieren will. Das
rächt sich dann.
P.S.
Ich vermeide prinzipiell, das Sternchen an den Typ zu kleben, sondern
umgebe ihn immer mit Leerzeichen links und rechts. Denn es gehört nicht
direkt zum Typ. Zum anderen habe ich mir angewöhnt, den Typ explizit vor
jeden Identifier wie z.B. einer Variablen zu schreiben. Ist zwar mehr
Schreibarbeit, ist aber lesbarer. Aus diesem Grund ist der Fehler in der
obigen Definition auch extrem schlecht zu erkennen.
Ein Compiler sieht
1
int*a,b,c;
als Kurzform von:
1
int*a;
2
intb;
3
intc;
Ein Mensch sieht das auf den ersten Blick unter Umständen anders.
Frank M. schrieb:> Ich vermeide prinzipiell, das Sternchen an den Typ zu kleben, sondern> umgebe ihn immer mit Leerzeichen links und rechts.
Man könnte das Sternchen an den Variablennamen kleben, das ist IMHO
eindeutiger.
Frank M. schrieb:> Fragender schrieb:>> typedef struct tscGroupPort{>> GPIO_TypeDef* tscGroup1,>> tscGroup2,>> tscGroup3,>> tscGroup4,>> tscGroup5,>> tscGroup6;>> }tscGroupPorts_t;>> Du hast 2 Möglichkeiten, das zu fixen:>> A) Du schreibst vor jeden Struct Member explizit den Typ hin und> schließt die Zeilen mit Semikolon statt Komma ab.>> B) Du wiederholst den Stern in jeder Zeile, damit tscGroup2 usw. auch> wirklich Pointer sind - so wie Du es auch für tscGroup1 vorgesehen hast.>> Ein oft gemachter Fehler, wie z.B.int main ()> {> int * a, b, c;> }>> a ist dann ein Pointer, b und c sind aber keine.>> So etwas passiert, wenn man alles möglichst knapp formulieren will. Das> rächt sich dann.>> P.S.>> Ich vermeide prinzipiell, das Sternchen an den Typ zu kleben, sondern> umgebe ihn immer mit Leerzeichen links und rechts. Denn es gehört nicht> direkt zum Typ. Zum anderen habe ich mir angewöhnt, den Typ explizit vor> jeden Identifier wie z.B. einer Variablen zu schreiben. Ist zwar mehr> Schreibarbeit, ist aber lesbarer. Aus diesem Grund ist der Fehler in der> obigen Definition auch extrem schlecht zu erkennen.>> Ein Compiler sieht> int* a, b, c;>> als Kurzform von:> int * a;> int b;> int c;>> Ein Mensch sieht das auf den ersten Blick unter Umständen anders.
Hi Frank
So funktionierts.
Rufus Τ. F. schrieb:> Mach doch mal den Textersatz, den der Präprozessor macht:>> configureGPIO(TSC_LS2_SAMPLE.pin, TSC_LS2_SAMPLE.port, ...)>> // wird im ersten Schritt zu>> configureGPIO({TSC_GROUP_PORT.tscGroup1,GPIO_PIN_2}.pin,> {TSC_GROUP_PORT.tscGroup1,GPIO_PIN_2}.port, ...)>> Das schluckt kein C-Compiler.
Vonwegen es schluckt kein Compiler...
Wirklich top von dir Frank, danke für deine Hilfe.
Ich hatte gemeint, wenn der Stern am Typ hängt, gälte das für alle
members. Wieder etwas neues gelernt.
Ich habe mich für deine Variante entschieden.
NichtWichtig schrieb:> Steht da doch:> a value of type "GPIO_TypeDef *" cannot be used to initialize an entity> of type "volatile uint32_t"
Woww! Suppper Tipp.
Rufus Τ. F. schrieb:> Man könnte das Sternchen an den Variablennamen kleben, das ist IMHO> eindeutiger.
Ja, könnte man, dagegen sträubt sich bei mir aber das ästhetische
Empfinden. Daher habe ich für mich Leerzeichen links und rechts vom
Sternchen als Kompromiss gewählt ;-)
Zudem ziehe ich die Variablennamen auf dieselbe Spalte. Dann sieht es
bei mir so aus:
1
intmain()
2
{
3
unsignedchar*bytearray;
4
int*intarray;
5
intcounter;
6
intnoch_ein_counter;
7
unsignedinterrorcode;
8
}
Das wäre für mich noch eine Alternative:
1
intmain()
2
{
3
unsignedchar*bytearray;
4
int*intarray;// beachte Lage des Sternchens
5
intcounter;
6
intnoch_ein_counter;
7
unsignedinterrorcode;
8
}
Die Kurzform
1
int*intarray,counter,noch_ein_counter;
vermeide ich jedoch grundsätzlich. Da braucht man viel zu lange, es mit
den Augen korrekt zu erfassen. Siehe oben: Das eigentliche Problem, dass
der TO hat, hat keiner der Leser auf Anhieb gesehen. Ich musste da auch
erst dreimal draufschauen.
Fragender schrieb:> error: #144: a value of type "GPIO_TypeDef *" cannot be used to> initialize an entity of type "volatile uint32_t"
Warum verstehst du die Fehlermeldung eigentlich nicht?
du hast eine Variable
1
volatileunsignedlongblabla;
und willst selbige mit einem Zeiger, nämlich GPIO_TypeDef* belegen.
Jetzt müßtest du bloß mal nachschauen, wie dein Typ "GPIO_TypeDef" denn
überhaupt definiert ist. Ich vermute mal, daß sich dahinter ein dicker
fetter struct befindet, der sämtliche Register eines der GPIO's enthält.
Aber das kannst du ja selber herauskriegen.
Warum mußt du eigentlich alles so unsäglich verkomplizieren, bis keiner
mehr durchsieht, was du da eigentlich gemacht hast (im Gegensatz zu
gemeint hast)
W.S.