Hallo, wenn ich in einem C-Programm versuche, eine globale Variable gamma zu deklarieren double gamma; erhalte ich die Fehlermeldung Fehler: »gamma« als andere Symbolart redeklariert Der Grund hierfür ist, dass in math.h bereits eine Funktion gamma deklariert wurde. Diese Funktion benötige ich nicht, wohl aber eine global definierte Variable gamma. (Informatik-Unterricht für Kinder in der Schule) Gibt es eine Möglichkeit, eine Variable gamma global zu deklarieren? Vielen Dank! k-mte
:
Verschoben durch Moderator
k-mte schrieb: > Fehler: »gamma« als andere Symbolart redeklariert Namensgleichheiten verschiedener Objekte sind der direkte Weg in die Hölle. Der Compiler ist hier intelligenter als du, folge ihm. Nimm meinetwegen "mygamma" wenn dir nichts besseres einfällt. Georg
Hey k-mte, in C++ hat man das Problem gelöst, in dem die Standardbibliothek einen so genannten Namespace benutzt. In C muss man es dann halt umgekehrt machen. Statt namespace kann man dazu einen struct verwenden. Ich finde das nicht per se eine schlechte Idee:
1 | #include<stdio.h> |
2 | |
3 | struct { |
4 | int gamma; |
5 | } globals = {.gamma = 42}; |
6 | |
7 | int main() { |
8 | printf("Antwort", globals.gamma); |
9 | } |
Edit: gerade fällt mir auf, dass für Schüler der designated initializer möglicherweise ein klein wenig gruselig ist, aber ist ja klar, du kannst das auch sonstwie initialisieren.
:
Bearbeitet durch User
Wie wäre es mit Gamma? (Ob Teufelszeug, mag ich nicht entscheiden)
Analog zu C++: m_member: double g_gamma;
:
Bearbeitet durch User
Einfach die Bibliothek ohne die Gammafunktion bauen. * Schon ist der Name frei verwendbar. *) Nebenwirkungen: Evtl. benutzen andere Funktionen die Gammafunktion. Die muss man dann auch entfernen.
k-mte schrieb: > Gibt es eine Möglichkeit, eine Variable gamma global zu deklarieren? Nein. Es ist auch Scheisse, eine Variable unbedingt while nennen zu wollen. Nimm eine andere Schreibweise, z.B. Gamma oder _gamma oder dbGamma (https://en.wikipedia.org/wiki/Hungarian_notation) oder einfach g Alle Tricks z.B. #define gamma mygamma double gamma; gamma=1.0; führen früher oder später zu Verwirrungen.
:
Bearbeitet durch User
Natürlich darfst du eine Variable gamma nennen. Der Konflikt entsteht durch eine GCC-Erweiterung mit diesem Namen. Mit -std=c18 oder -std=c11 schaltest du diese und andere Erweiterungen aus.
:
Bearbeitet durch Moderator
Mir macht viel eher die Anfrage zusammen mit diesem Satz sorgen: "Informatik-Unterricht für Kinder in der Schule" Ist es nicht viel eher so, dass dieser Fehler ruhig auch gemacht werden sollte, um entsprechende Compiler-Ausgaben zu erklären? Der Versuch, mit Gewahlt hier um die erneute Deklaration eines bereits benutzten Symbols herumzukommen, ist nicht die passende und sorgt, wie zu sehen, eher für Frust. Beim nächsten Mal sollten die Schüler dann eine abs()-Funktion neu selber schreiben oder... das kann auf Dauer keine Lösung sein. Ich stimme daher folgendem zu: Namensgebung anpassen - myGamma, gGamma, _gamma, ... (Gamma ist eher kontraproduktiv imho, da es nun gamma und Gamma gibt - zwar richtig, aber eher schwerer leserlich, wenn beides im Einsatz ist)
Ergänzung: Kompilerflags zur Deaktivierung sind wohl möglich, aber bei dem zu Erwartenden Kenntnissstand (Lehrer UND Schüler) eher auch etwas für später.
Michael schrieb: > Ergänzung: Kompilerflags zur Deaktivierung sind wohl möglich, Die Kompilerflags -std=c11/17 sind allerdings sehr sinnvoll, weil dann direkt Standard-C gelernt wird statt der GCC-Erweiterungen. Dass "gamma" dann frei ist ist ein angenehmer Nebeneffekt. Globale Variablen sind im Übrigen sowieso keine besonders gute Idee. Michael schrieb: > Namensgebung anpassen - myGamma, gGamma, _gamma, Aber Achtung: _Gamma oder __gamma wären verboten, da der Standard-Bibliothek vorenthalten.
:
Bearbeitet durch User
Michael schrieb: > Ergänzung: Kompilerflags zur Deaktivierung sind wohl möglich, aber bei > dem zu Erwartenden Kenntnissstand (Lehrer UND Schüler) eher auch etwas > für später. Gerade bei Lernenden sollten IMHO die Optionen -std=c18 und -Wall als Default in der verwendeten Entwicklungsumgebung eingestellt sein. Die Lernenden müssen diese Optionen weder sehen noch verstehen, aber sie sollten in den Genuss der dadurch erzeugten Fehlermeldungen und Warnungen kommen.
Yalu X. schrieb: > Gerade bei Lernenden sollten IMHO die Optionen -std=c18 und -Wall als > Default in der verwendeten Entwicklungsumgebung eingestellt sein. Am Besten noch direkt -Wexta -Werror. Warnungen werden sonst zu schnell ignoriert. Konstrukte, bei denen Warnungen wirklich unvermeidbar sind, dürften im Lehrbetrieb nicht auftreten.
k-mte schrieb: > Gibt es eine Möglichkeit, eine Variable gamma global zu deklarieren? Nenne sie dbl_gamma. Dann weiß auch der geneigte Leser gleich, von welchem Typ sie ist. Und die Kinder werden es verstehen, wenn du das ihnen didaktisch vernünftig nahe bringst. Hoffentlich brauchst du sie nur als warnendes Beispiel, um zu zeigen, welche Probleme es mit globalen Variablen geben kann.
Da zeigt sich was passiert wenn man Fachfremde Menschen dazu nötigt Dinge zu lehren von denen sie nicht genug Ahnung haben um es eben zu lehren. ...
Yalu X. schrieb: > Gerade bei Lernenden sollten IMHO die Optionen -std=c18 und -Wall als > Default in der verwendeten Entwicklungsumgebung eingestellt sein. Und -pedantic und -Wextra.
Konstrukte wie _gamma sollten vermieden werden. Das Hatten wir doch gerade schon: Beitrag "Was bedeuten vorgestellte "underline"?"
Hallo, Die Schüler benutzen das C-Programm wie einen Taschenrechner. Selbst geschriebene Funktionen kennen sie noch nicht. Eine typische Aufgabe wäre z. B. die Berechnung der Innenwinkelsummen von Drei- und Vierecken. vielen Dank für die Antworten, auch für die Warnungen! k-mte
k-mte schrieb: > die Berechnung der Innenwinkelsummen von Drei- und Vierecken. return 180 bzw. return 360 SCNR
Kaj schrieb: > Konstrukte wie _gamma sollten vermieden werden. Nein. Das ist völlig legal. > Das Hatten wir doch gerade schon: Na, dann lies das doch gleich noch mal. > Beitrag "Was bedeuten vorgestellte "underline"?" leo
leo schrieb: > Kaj schrieb: >> Konstrukte wie _gamma sollten vermieden werden. > > Nein. Das ist völlig legal. Aus ISO C: "All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces."
Rolf M. schrieb: >>> Konstrukte wie _gamma sollten vermieden werden. >> >> Nein. Das ist völlig legal. > > Aus ISO C: > > "All identifiers that begin with an underscore are always reserved for > use as identifiers with file scope in both the ordinary and tag name > spaces." Ja, du hast Recht. Ich hatte irgendwie eine lokale Variable _gamma im Kopf. leo
k-mte schrieb: > wenn ich in einem C-Programm versuche, eine globale Variable gamma zu > deklarieren > > double gamma; Und warum muß diese Variable ausgerechnet Gamma heißen? Du könntest sie ja auch double Ergebnis; nennen. Oder ist dir das zu einfach? W.S.
W.S. schrieb: > Und warum muß diese Variable ausgerechnet Gamma heißen? > Du könntest sie ja auch > double Ergebnis; Ergebnis ist aber sehr allgemein. Alles ist irgendwie ein Ergebnis. Man sollte schon erahnen können, was für ein Ergebnis das ist. Gamma ist auch nicht so richtig deskriptiv, aber in einem bestimmten Kontext ist es vielleicht klar.
W.S. schrieb: > k-mte schrieb: >> wenn ich in einem C-Programm versuche, eine globale Variable gamma zu >> deklarieren >> >> double gamma; > > Und warum muß diese Variable ausgerechnet Gamma heißen? Für mich wäre eher die Frage: Warum muss sie unbedingt global sein? > Du könntest sie ja auch > > double Ergebnis; > > nennen. Oder ist dir das zu einfach? Vielleicht ist sie ja nicht für das Ergebnis, sondern für einen von mehreren Eingangswerten.
Falls nach all dem Geschriebenen jemand immer noch eine Phobie gegen ausgeschriebene Gammas haben sollte, kann er diese bei der Verwendung von CLang als C-Compiler auch direkt als Symbol verwenden. Beispiel:
1 | #include <stdio.h> |
2 | #include <math.h> |
3 | |
4 | #define Γ tgamma |
5 | #define lnΓ lgamma |
6 | |
7 | int main(void) { |
8 | |
9 | printf("Innenwinkel im Viereck\n"); |
10 | printf(" α β γ in °: "); |
11 | double α, β, γ; |
12 | scanf("%lf %lf %lf", &α, &β, &γ); |
13 | printf(" δ = %.1f°\n", 360.0 - α - β - γ); |
14 | |
15 | printf("\nΓ-Funktion\n"); |
16 | printf(" x: "); |
17 | double x; |
18 | scanf("%lf", &x); |
19 | printf(" Γ(x) = %.4g\n", Γ(x)); |
20 | printf(" ln Γ(x) = %.4g\n", lnΓ(x)); |
21 | } |
k-mte schrieb: > Gibt es eine Möglichkeit, eine Variable gamma global zu deklarieren? k-mte schrieb: > Die Schüler benutzen das C-Programm wie einen Taschenrechner. Selbst > geschriebene Funktionen kennen sie noch nicht. Muss die Variable dafür unbedingt gamma heißen, oder wäre es eine Option, sie z.B. Gamma zu nennen?
Wolfgang schrieb: > Muss die Variable dafür unbedingt gamma heißen, oder wäre es eine > Option, sie z.B. Gamma zu nennen? Man schreibt kein Variablen groß! Das verstößt gegen das Prinzip der geringsten Verwunderung.
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.