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