Wie Variable gamma deklarieren, obwohl bereits die Funktion gamma deklariert ist?

Gast #5889627
Lesenswert?

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
(Firma: privatfrickler.de) #5889696
Lesenswert?

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.
#5889805
Lesenswert?

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.
Gast #5890024
Lesenswert?

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)
Persönliche Seite #5890054
Lesenswert?

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.
Moderator #5890055
Lesenswert?

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.
Persönliche Seite #5890059
Lesenswert?

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.
Gast #5890094
Lesenswert?

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.
Gast #5890630
Lesenswert?

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
Gast #5890644
Lesenswert?

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.
#5890671
Lesenswert?

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.
Moderator #5890734
Lesenswert?

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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren