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