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.
Check mal: extern Aber sei vorsichtig mit zu vielen globalen Variablen!
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?
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
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.
:
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.