mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zugriff auf structs in anderer Source-Datei


Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe folgende Definition und Deklaration:
typedef struct
{                        
   unsigned long currentCluster;
   unsigned int byteCount;  
   unsigned long firstCluster;    
   unsigned long fileSize;
   unsigned long dirLocation;    
   unsigned char sectorCount;    
   signed char fileHandle;
   unsigned char updateDir;
} file;

static file openedRead[BUFFER_SIZE];


Nun möchte ich auch in Funktionen, die außerhalb dieser c-Datei sind, 
auf openedRead zugreifen.
Ich habs bereits mit
extern struct file;
extern file openedRead;
versucht, aber der Compiler sagt, dass file ein undefinierter Bezeichner 
sei.
Wie bekomm ich das mit möglichst geringem Aufwand hin? Ich möchte 
eigentlich kein global.h erstellen, in dem dann diese Definitionen und 
Deklarationen drinstehen.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dann leg doch die Structur in eine header datei und binde sie in beiden 
C datein per include ein.

Autor: Mark M. (mom-jovi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die Struktur aber gerne da lassen, wo sie ist.
Mit
extern struct file openedRead[BUFFER_SIZE]
 müsste es doch eigentlich gehen, wenn die Header mit der Struktur 
inkludiert ist.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark M. schrieb:
> Ich würde die Struktur aber gerne da lassen, wo sie ist.

dann sage uns erstmal wo sie ist, dann bis jetzt konnt ich noch nicht 
rauslesen wo sie denn deklariert ist.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das typedef struct ... gehört in eine Headerdatei.

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> static file openedRead[BUFFER_SIZE];
> Nun möchte ich auch in Funktionen, die außerhalb dieser c-Datei sind,
> auf openedRead zugreifen.

Geht nicht, wenn du auf static beharrst. Mit static ist die Sichtbarkeit 
der Variablen openedRead auf das Sourcefile begrenzt in dem die Variable 
definiert wird.

Autor: Seltsam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bzw. ein Umweg wäre ein Zugriff über eine Funktion.

Autor: Kai S. (zigzeg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark M. schrieb:
> Ich würde die Struktur aber gerne da lassen, wo sie ist.
> Mit
>
extern struct file openedRead[BUFFER_SIZE]
 müsste es doch
> eigentlich gehen, wenn die Header mit der Struktur inkludiert ist.

Genau, der typedef kommt in den header. Der header wird von beiden C 
Dateien includiert. Die Definition kommt in die eine C Datei, dabei muss 
das static weg (wichtig !), denn static heisst (bei globalen Variablen 
zumindest) "nur sichtbar in diesem Modul" (=diese C Datei) .

In die andere C Datei dann ein "extern struct ..." wie vorgeschlagen.

Sauberer ist es aber alle Zugriffe einer Datenstruktur in einer Datei zu 
machen, und dann nur die Zugriffs-Funktionen ueber den Header bekannt zu 
machen. Nennt sich auch modulare Programmierung.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.