Forum: Mikrocontroller und Digitale Elektronik Zugriff auf Enum (Gültigkeitsbereich)


von C Anfänger (Gast)


Lesenswert?

Hallo,
ich habe folgendes Problem:
Ich möchte in einer H.Datei ein enum sowie einen Befehl deklarieren und 
in einer C.Datei mit diesem Befehl auf das Enum zugreifen und 
schließlich in einer 2ten C.Datei den Befehl ausführen.
Ich weiß halt nur nicht wie man am besten macht.
Mit globalen Enum oder besser mit einem Pointer auf das Enum dem man dem 
Befehl übergibt???

Sowas inder Art:
###h.datei###
typdef enum {Fisch, Fleisch}Essen_t;
void Set_Fisch(void);

Essen_t Essen;

###c1.datei###
void Set_Fisch(void)
{Essen = Fisch;}

###C2.datei###
int main(){
Set_Fisch();
}

Ich hoffe ihr versteht was ich erreichen möchte und das ihr mir helfen 
könnt. Bin ziemlich unerfahren in c

von Theor (Gast)


Lesenswert?

Du wirst, wie alle Anfänger, erst einmal den "Fehler" machen müssen, es 
so hin zu schreiben, dass es funktioniert. Das klingt merkwürdig, ist 
aber mein Ernst.

Als Hinweis möchte ich aber anfügen, dass Dein Problem zunächst nichts 
mit enums bzw. dem Datentyp an sich zu tun hat. Das gilt auch für 
Zeiger, denn was an globalen/lokalen Daten problematisch ist, ist es 
auch, wenn das globale/lokale Datum ein Zeiger ist.

Der Punkt ist vielmehr, ob und für wen ein bestimmtes Datum "sichtbar" 
im Sinne von lesbar bzw. schreibbar ist. Darüber kannst Du Dir erst 
einmal Gedanken machen und dazu in Deinem C-Buch was über Sichtbarkeit 
von Variablen lesen. Ein weiterer Punkt ist, dass noch so viele 
Erklärungen einfach nicht die Erfahrung ersetzen, dass es einmal schief 
geht und selbt herauszufinden warum es schief gegangen ist. Und 
abschliessend: Das Thema ist schon gefühlt 10.000 Mal hier und woanders 
abgehandelt worden - nicht zuletzt in den C-Büchern. Du darfst Dich nur 
nicht auf enums beschränken - es handelt sich ja auch nicht, wie ich 
oben erwähnte, um ein Problem das speziell bei enums auftritt.

Viel Erfolg.

von Jim M. (turboj)


Lesenswert?

C Anfänger schrieb:
> Ich hoffe ihr versteht was ich erreichen möchte und das ihr mir helfen
> könnt. Bin ziemlich unerfahren in c

Dann nehme man so ein Ding aus totem Holz - ein Buch - und liesst es. 
Denn C ist uralt und alles Andere als selbsterklärend.

Ernsthaft, ohne den K&R hatte ich zu meinen PASCAL Zeiten in der Windows 
Programmierer-Hilfe (damals komplett C) nur die Hälfte verstanden.

C Anfänger schrieb:
> Ich weiß halt nur nicht wie man am besten macht.
> Mit globalen Enum oder besser mit einem Pointer auf das Enum dem man dem
> Befehl übergibt???

Das kommt darauf an(tm). Hat beides Vor- und Nachteile, beispielsweise 
in der Frage ob man in der Zukunft mehr als einen Enum benötigt.

von Entwiggler (Gast)


Lesenswert?

Check mal: extern

Aber sei vorsichtig mit zu vielen globalen Variablen!

von C Anfänger (Gast)


Lesenswert?

Entwiggler schrieb:
> Check mal: extern

Mit extern geht´s.
Ich habe mir einige Einträge ander Threads durchgelesen und 
globale/lokale Variablen folgendermaßen verstanden:
Deklariere ich in einer .H-Datei eine Variable und initialisiere sie in 
einer C1.c Datei dann ist die Variable auch nur innerhalb von C1 
sichtbar/veränderbar nicht aber in einer C2.c Datei. Also lokal.
Deklariere ich die Variable als extern und initialsiere sie in C1 dann 
ist sie in allen .C Datein veränderbar, die die .H inlcuden. Richtig 
soweit?

Entwiggler schrieb:
> Aber sei vorsichtig mit zu vielen globalen Variablen!

Globale Variablen sollen aber möglichst vermieden werden z.b. indem man 
Pointer benutzt. Dann müsste aber dieser Pointer global sein oder? Wo 
ist denn dann der Vorteil zwischen einem globalen Pointer und einer 
globalen Variablen?

von Einer K. (Gast)


Lesenswert?

C Anfänger schrieb:
> Globale Variablen sollen aber möglichst vermieden werden z.b. indem man
> Pointer benutzt. Dann müsste aber dieser Pointer global sein oder? Wo
> ist denn dann der Vorteil zwischen einem globalen Pointer und einer
> globalen Variablen?

Globale Pointer sind auch globale Variablen.
Damit ist beides gleich böse.

Das würde die Wiederverwendbarkeit der Funktion einschränken.
Auch wird die Wiedereintrittsfähigkeit damit unterbunden.

Der Trick ist, in Funktionen, auf keine globalen Variablen direkt 
zuzugreifen.
Das vermeidet eine starre Abhängigkeit.

Darum alle Abhängigkeiten über die Parameterliste an die Funktion 
übergeben.
Und das geht eben oft nur per Pointer, in C.
In C++ werden da gerne Referenzen verwendet.

Leitsatz:
Keine festen Abhängigkeiten in Funktionen!

Übrigens:
Ganz vermeiden lassen sich feste Abhängigkeiten eher nicht.
Aber man kann sie auf ein Mindestmaß einschränken.

von A. S. (Gast)


Lesenswert?

Zu Deinen Überlegungen wo eine Variable declariert, definiert und 
initialisiert wird, schaue bitte die 3 Begriffe nach und bedenke: der 
Compiler kennt keine .h-Dateien! maximal setzt der Präprozessor eine 
ganze Datei dort ein, wo deren #include steht.

Deine Überlegungen zu globalen Variablen und Pointern machen hier nur 
Sinn, wenn Du mehrere davon lokal in einem c-file oder einer Funktion 
hast (static Essen_t e1, e2, e3;). Dann übergebe deren Adresse beim 
funktionsaufruf. Es gibt dann keine Parallelen expliziten Pointer.

von Theor (Gast)


Lesenswert?

C Anfänger schrieb:
> Entwiggler schrieb:
>> Check mal: extern
>
> Mit extern geht´s.
> Ich habe mir einige Einträge ander Threads durchgelesen und
> globale/lokale Variablen folgendermaßen verstanden:
> Deklariere ich in einer .H-Datei eine Variable und initialisiere sie in
> einer C1.c Datei dann ist die Variable auch nur innerhalb von C1
> sichtbar/veränderbar nicht aber in einer C2.c Datei. Also lokal.
> Deklariere ich die Variable als extern und initialsiere sie in C1 dann
> ist sie in allen .C Datein veränderbar, die die .H inlcuden. Richtig
> soweit?

Nein. Das ist sowohl von den Begriffen als auch von den impliziten 
Schlussfolgerungen her falsch.

Es gibt genau festgelegte Begriffe und mit diesen Begriffen präzise 
formulierte Zusammenhänge.
So ist etwa eine "Deklaration" etwas anderes als eine "Definition" und 
das wiederum etwas anderes als eine "Initialisierung". Hier bestimmt die 
genaue Form der Definition bzw. Deklaration auch den 
Sichtbarkeitsbereich. Das Schlüsselwort "extern" führt allerdings in 
diesem Kontext in die richtige Richtung. Abgesehen davon, spielt auch 
der verwendete C-Standard eine Rolle, weil es da inzwischen gewisse 
Veränderungen gegenüber dem ursprünglichen K&R-C bzw. ANSI-C gibt. 
(Welche C-Versionen Dein Compiler unterstützt und welche er akut 
verwendet, steht in der Dokumentation).

> Globale Variablen sollen aber möglichst vermieden werden z.b.
> indem man Pointer benutzt. Dann müsste aber dieser Pointer
> global sein oder? Wo ist denn dann der Vorteil zwischen einem
> globalen Pointer und einer globalen Variablen?

Da würde mich mal langsam interessieren wo das steht, dass man globale 
Variablen vermeidet, in dem man Pointer verwendet. (Poste doch mal einen 
Link auf den Beitrag). Aber wie ich oben schon schrieb und es scheint 
Dir ja selbst fraglich, spielt der Datentyp bzw. Pointer oder 
Nicht-Pointer bei dem Problem keine Rolle. Das Problem mit dem 
Sichtbarkeitsbereich bleibt bestehen.

Ich wiederhole mich mal (aber dann auch kein weiteres Mal): Lies ein 
C-Buch. Threads in Foren haben oft den Nachteil, dass sie sich auf 
bestimmte Teilaspekte beziehen bei denen der Anfänger oft nicht 
beurteilen kann, ob sie sich tatsächlich auf sein akutes Problem 
beziehen und das sie vor allem neben durchaus korrekten Antworten auch 
eine Menge falsche oder unklare, widersprüchliche Antworten enthalten. 
Ausnahmen von dieser Regel sind allenfalls Beiträge von Falk, Peter 
Dannegger, oder Johann G (die Liste ist keinesfalls erschöpfend).

Du musst Dir einmal selbst folgende Fragen beantworten:
1. Was sind die Sichtbarkeitsbereiche (Scope) in C und welche Konsequenz 
haben die verschiedenen Arten?
2. Was sind "Definition", "Deklaration" und "Initialisierung" von 
Variablen, was sind ihre Wirkungen?
3. Was ist grundsätzlich das Problem mit globalen Variablen? Warum 
sollen sie vermieden werden? Unter welchen Umständen sind sie 
tatsächlich (in irgendeiner Variante) nötig? Welche Wege, globale 
Variablen zu vermeiden, gibt es überhaupt?

von Marco H. (damarco)


Lesenswert?


von Theor (Gast)


Lesenswert?

Marco H. schrieb:
> http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_010.htm
>
> mehr wie viele Worte ;)

und leider (mit allem schuldigen Respekt für die Person von Marco H.) 
ein Beispiel für die von mir erwähnten falschen Antworten.

Ignoriere den Beitrag bitte, C Anfänger. Das Problem hat nämlich, wie 
oben schon beschrieben, nichts mit enums zu tun.

Das verlinkte Buch ist ohnehin leider etwas lakonisch und etwas 
veraltet, was die C-Versionen betrifft, aber wenn Du gar kein Buch hast, 
dann lies mal die Abschnitte, 9.6 bis 9.12 hier 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/009_c_funktionen_011.htm#ix252903ed739b32b24a166dc2b8b813a3

von C Anfänger (Gast)


Lesenswert?

Vielen Dank Theor, ich fand deine Beiträge sehr erhellened und sie 
zeigen mir dass ich noch eine Menge zu lernen habe, angefangen bei den 
Begrifflichkeiten.

Wie gesagt mit extern bekommen ich zumindest meine Funktionalität so hin 
wie ich sie haben möchte aber deine Beiträge animieren mich mehr zu 
lesen um so besser zu werde und meinen Quellcode zu verbessern.

von Marco H. (damarco)


Lesenswert?

Nun mag sein aber die Grundlagen sind die gleichen und wenn man die 
verstanden hat kann man gezielt nach der geigenden Lösung suchen.

Das Problem bei Anfängern ist immer das sie in ihrem Verständnis eine 
einfache Lösung suchen. Sich aber damit recht tief ins Unglück stürzen.

: Bearbeitet durch User
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.