Forum: Mikrocontroller und Digitale Elektronik Header File


von Mike (Gast)


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

von Fritz Ganter (Gast)


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.

von Mike (Gast)


Lesenswert?

danke, werde dies gleich mal ausprobieren..

von Mike (Gast)


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

von Fritz Ganter (Gast)


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;

von Mike (Gast)


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??

von Marcus M (Gast)


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.

von Mike (Gast)


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...
}

von Marcus M (Gast)


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----------------------------------------

von Fritz Ganter (Gast)


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.

von Mike (Gast)


Lesenswert?

und worin unterscheidet sich dieser code von dem code von fritz???

von Mike (Gast)


Lesenswert?

sorry, bin wohl einwenig verwirrt ;o)

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

von Mike (Gast)


Lesenswert?

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

von Marcus M (Gast)


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!

von Mike (Gast)


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.....

von Fritz Ganter (Gast)


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.

von Mike (Gast)


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?

von Fritz Ganter (Gast)


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.

von Mike (Gast)


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???

von Fritz Ganter (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.