typedef wird nicht erkannt

Gast #5756486
Im main.c habe ich folgendes definiert:
1
struct gpioTime
2
{
3
  GPIO_TypeDef * port;
4
  const uint16_t pin;
5
  uint16_t zeit;
6

7
}; 
8

9
typedef struct gpioTime GPIO_t;
10

11
GPIO_t time[] = {    
12
  {GPIOA, GPIO_PIN_6, 4},   // Pin, Pulszeit, Totzeit
13
  {GPIOA, GPIO_PIN_7, 3},
14
  {GPIOA, GPIO_PIN_8, 6}
15
};

time[] möchte ich nach aussen zugänglich machen.
Dazu schreibe ich im main.h
1
extern GPIO_t time[];

dann folgt "unknown type name"
Warum funktioniert das nicht?
stefanius schrieb:
> Dazu schreibe ich im main.h
>
>
1
> 
2
> extern GPIO_t time[];
3
> 
4
>
>
> dann folgt "unknown type name"
> Warum funktioniert das nicht?

Weil an der Stelle halt bekannt sein muss, was ein GPIO_t denn 
eigentlich ist, um damit ein Array deklarieren zu können. Ist es aber 
nicht.

Schreib doch die Deklaration in eine eigene Header-Datei. Die kannst Du 
überall inkludieren wo sie gebraucht wird, auch in main.c.

Übrigens ist es unüblich, dass es eine main.h gibt in der man eigene 
Datentypen definiert.
Gast
Du könntest sowas ähnliches ohne Internas verwenden, nämlich Pointer auf 
eine Struktur.
Für Kapselung (information hiding)
Kommt aber drauf an, was Du erreichen willst.
Gast
stefanius schrieb:
> Im main.c habe ich folgendes definiert:
> struct gpioTime
> {
>   GPIO_TypeDef * port;
>   const uint16_t pin;
>   uint16_t zeit;
>
> };
>
> typedef struct gpioTime GPIO_t;
>
> GPIO_t time[] = {
>   {GPIOA, GPIO_PIN_6, 4},   // Pin, Pulszeit, Totzeit
>   {GPIOA, GPIO_PIN_7, 3},
>   {GPIOA, GPIO_PIN_8, 6}
> };
>
> time[] möchte ich nach aussen zugänglich machen.
> Dazu schreibe ich im main.h
>
> extern GPIO_t time[];

Ähemm...

Erstmal was formelles: Du hast im Struct port+pin+zeit und im obigen 
Kommentar Pin+Pulszeit+Totzeit. Das paßt nicht zusammen.

Als nächstes sehe ich noch keine wirkliche Verwendungsmöglichkeit für 
dein gesamtes Konstrukt - und leserlich ist das auch nicht. Sol das mal 
eine Art Ablaufsteuerung werden? Wenn ja, dann ist Totzeit wohl falsch 
und es müßte das Ganze eher so aussehen:
1
struct ZeitElement
2
{ int  idSignalname;   // nicht Portname, sondern Signalbezeichner
3
  long Startzeitpunkt; // in Millisekunden
4
  long Dauer;          // in Millisekunden
5
  bool invertiert;     // ob HI-Puls oder LO-Puls
6
}

und dazu dann sowas für idSignalname:
#define idGeblaese   1
#define idGasventil  2
#define idZuendTrafo 3
#define idIoniSonde  4

usw.

Als nächstes ist es so, daß alles, was Speicherplatz kostet, also aller 
Code und alle Variablen und typisierten Konstanten in eine .c kommt. 
Typdeklarationen hingegen kommen entweder in diejenige .c, wo sie intern 
verwendet werden oder (falls die Typdeklaration auch woanders nötig ist) 
kommt sie in die zugehörige .h hinein.

Also nicht struct xyz {..}; in main.c, sondern in die .h des zugehörigen 
Lowlevel-Treibers (und NICHT in irgend eine .h eines benutzenden 
Programmteiles).

Der Grund ist, daß der LL-Treiber, der die Funktionen enthält, die aus 
den Struct-Elementen irgend eine Reaktion der Hardware machen sollen, 
selber den Struct kennen muß - aber er kann prinzipiell NICHT wissen, 
welche sonstigen Programmteile ihn zu benutzen gedenken. Also all diese 
Sachen in den LL-treiber und dessen .h hineinschreiben.

Die den LL-treiber benutzenden Teile deiner Firmware können dann ganz 
easy dessen .h inkludieren und wissen dann auch, was sie wissen müssen. 
Also so herum.

Und typedef kann man sich sparen, sofern man jedesmal das "struct" 
dazuschreibt. Dein extern GPIO_t time[] funktioniert also nur dann, wenn 
du alles, also sowohl das typedef als auch das zugrundeliegende struct 
gpioTime dazu in die .h schreibst.

W.S.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.