mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Header File


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

Weiss wirklich niemand, wie man folgendes in ein Header File main.h
verpackt.
Mein main.c lautet folgendermassen:

struct drink1 {
                      unsigned char menge_orangensaft;
          unsigned char menge_vodka;
          }drink_screwdriver={12,4};



void main (void)
{
Programm...
}

ich habe nun daraus folgendes main.h file gemacht:

#ifndef main_h
#define main_h

extern struct drink1 {
                      unsigned char menge_orangensaft;
          unsigned char menge_vodka;
          }drink_screwdriver;

#endif

leider habe ich laufend errormeldungen. Weiss jemand, wie man eine
Struktur im Header File implementiert??
drink1 ist der Strukturname und drink_screwdriver der Variabelname der
Struktur...

Bitte helft mir

Danke

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst ein typedef machen.

also

typedef struct
{
                      unsigned char menge_orangensaft;
          unsigned char menge_vodka;
          }drink1;

und dann

drink1 drink_screwdriver;

extern verwendest du nur wenn die Variable woanders definiert ist, hier
jedoch nicht.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke, werde dies gleich mal ausprobieren..

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
noch eine frage:

Das "drink1 drink_screwdriver;" kommt dan ins headerfile und es ist
richtig,dass das extern weggelassen werden muss, auch wenn ich es in
anderen c files im gleichen projekt auch noch verwende?

danke

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das "drink1 drink_screwdriver;" kannst du hintun wo du willst.

Normalerweise macht man das Typedef ins Headerfile.
In genau einem File machst das "drink1 drink_screwdriver;", in
allen anderen Files dann (wenn du die Variable dort brauchst) ein

extern drink1 drink_screwdriver;

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dies funktioniert bei mir nicht so toll.

Also, hab folgendes gemacht:

im main.c steht folgendes:

typedef struct drink1 {
                      unsigned char menge_orangensaft;
          unsigned char menge_vodka;
          }drink_screwdriver={12,4};

drink1 drink_screwdriver;

void main(void)
{
programm...
}


im headerfile main.h steht folgendes:

extern drink1 drink_screwdriver;


wieso läuft es immer noch nicht??

Autor: Marcus M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mike,

andersherum wird da wohl besser ein Schuh draus:

--------------------------main.h-------------------------------------

#ifndef main_h
#define main_h

typedef struct drink1 {

  unsigned char menge_orangensaft;
  unsigned char menge_vodka;
};

#endif

-------------------------main.h---------------------------------------

-------------------------main.c---------------------------------------

#include "main.h"

drink1 drink_screwdriver = {12,4};

void main(void)
{
programm...
}

------------------------main.c----------------------------------------

mit dem Aufruf:
typedef struct drink1 {
                      unsigned char menge_orangensaft;
          unsigned char menge_vodka;
          }drink_screwdriver={12,4};

Hast du IMHO etwas anderes gemacht. Du hast sowohl eine structure
drink1 als auch eine structure drínk_screwdriver generiert, letzte hat
defaultmäßig die Werte 12, 4.

Die Hauptfrage ist noch, welche Art von compiler Du benutzt.
Es kann Dir bei diesem Aufruf passieren, das nur drink1 als structure
erzeugt wird, oder nur drink_screwdriver oder beide.
Falls Dein Compiler im singlepass Modus arbeitet, erzeugt er drink1,
falls er den Multipassmodus kennt, erzeugt er drink_screwdriver und
gegebenfalls auch drink1.

Also kurz, Du hast zwei Strukturen erzeugt, die bis auf die
Initialisation identisch sind, aber keine Variable erzeugt. Somit
kannst Du auch mit der structure nicht arbeiten.

Entweder verwende bitte:
typedef struct <Typ> {  ..... };
oder
typedef struct { .... } <Typ>;
Der Aufruf ist dabei Compilerabhängig. Standartconformer ist der
erste!

Gruß

Marcus

PS: Versuch mal bitte den oberen code.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also marcus

würde dies gerne probieren, jedoch komme ich nicht ganz draus, was du
mir da erzählen willst.

Kannst du mir bitte in das untenstehende eintragen, wie das aussehen
soll?:

--------------------------main.h-------------------------------------

#ifndef main_h
#define main_h


#endif

-------------------------main.h---------------------------------------

-------------------------main.c---------------------------------------

#include "main.h"


void main(void)
{
programm...
}

Autor: Marcus M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
--------------------------main.h-------------------------------------

#ifndef main_h
#define main_h

typedef struct drink1 {

  unsigned char menge_orangensaft;
  unsigned char menge_vodka;
};

#endif

-------------------------main.h---------------------------------------

-------------------------main.c---------------------------------------

#include "main.h"

drink1 drink_screwdriver = {12,4};

void main(void)
{
programm...
}

------------------------main.c----------------------------------------

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@mike:

Mein Beispiel war schon richtig, aber du hast es falsch abgetippt.

typedef definiert dir eine structur mit einem namen, aber es ist
deswegen noch kein Speicher reserviert.

typedef
{ int a;
  int b;
} mystruct;

sagt dem Compiler nur wie die Struktur mystruct aussieht;

mystruct abc;

erzeugt eine Variable abc die eine Struktur hat wie sie in mystruct
definiert ist, es geht also (glaub ich):

mystruct abc{1,2};

aber nicht so wie du es geschrieben hast.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und worin unterscheidet sich dieser code von dem code von fritz???

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sorry, bin wohl einwenig verwirrt ;o)

werde den code gleich mal ausprobieren. Bitte an der Tastatur bleiben
;o)

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok fritz, werde beide codes von euch mal durchspielen und sage euch dan,
wer als gewinner vom platz geht ;o)

Autor: Marcus M (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Mike,

ich habe mit den Code von Deinem Posting von 15:48h angeschaut.
Fritz und ich haben Dir im Grunde - unabhängig - den selben code
geschickt.
Fritz erzeugt die structure ohne dem Compiler expliziet zu sagen, das
es sich um eine structure handelt, ich sags ihm nochmal expliziet. Ist
Geschmackssache!
Den Code von Fritz habe ich irgendwie überlesen - Sorry Fritz!

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok, ich habe folgendes programmiert:

--------------------------main.h-------------------------------------

#ifndef main_h
#define main_h

typedef struct {
                      unsigned char menge_orangensaft;
          unsigned char menge_vodka;
          }drink1 ;
#endif

-------------------------main.h---------------------------------------

-------------------------main.c---------------------------------------

#include "main.h"

drink1 drink_screwdriver = {12,4};

void main(void)
{
programm...
}

------------------------main.c----------------------------------------

Nun beschwert sich der compiler in den anderen xxx.c files in meinem
projekt,  "Error[Pe020]: identifier "drink_screwdriver" is
undefined
"
Ich habe in jedem anderen xxx.c file im kopf oben
#include "main.h" geschrieben, somit sollte er die structur doch
kennen.....

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im anderen C File musst noch reinschreiben:

extern drink1 drink_screwdriver;

dann kennt er es. Mit dem Includefile kennt er nur die Struktur als
Type , aber nicht die Variable.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber wenn ich in verschiedenen anderen c files auf diese struktur
zugriff haben soll, kann ich das extern drink1 drink_screwdriver doch
auch ins headerfile des main.h schmeissen?oder?
oder muss ich in jedem xxx.c file das extern implementieren?

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist eigentlich egal, aber:

Ein File muss es ohne extern haben, die anderen mit extern.

Ich mach die extern variablen nie in den Header, sondern trage ins .c
File nur die Variablen ein, die ich da auch verwende. Dann hab ich auch
eher den Überblick.

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, im main.c habe ich ja folgendes geschrieben
drink1 drink_screwdriver{15;3};

nun kann ich also ins main.h file "extern drink1 drink_screwdriver"
schreiben zuzüglich dem typdef struct.... und dieses in den funktionen,
bei welchen ich auf drink_screwdriver zugreiffen muss das main.h
includen, oder???

Autor: Fritz Ganter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Typedef auf jeden Fall.

das "extern..." sollte aber nicht im main.c includiert sein, ich
weiss nicht ob das der Compiler frisst. Sonst musst es für main.c über
#ifdef rausnehmen.

Einfach nachdenken und ausprobieren, du willst ja das Programm
schreiben , nicht ich.

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.