Forum: PC-Programmierung Wie Variable gamma deklarieren, obwohl bereits die Funktion gamma deklariert ist?


von k-mte (Gast)


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

: Verschoben durch Moderator
von Einer K. (Gast)


Lesenswert?

Nein!

von georg (Gast)


Lesenswert?

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

von Timm R. (Firma: privatfrickler.de) (treinisch)


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.

: Bearbeitet durch User
von S. Landolt (Gast)


Lesenswert?

Wie wäre es mit Gamma? (Ob Teufelszeug, mag ich nicht entscheiden)

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Analog zu C++: m_member:

double g_gamma;

: Bearbeitet durch User
von $$$ (Gast)


Lesenswert?

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.

von Michael B. (laberkopp)


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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von Michael (Gast)


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)

von Michael (Gast)


Lesenswert?

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.

von npn (Gast)


Lesenswert?

Michael schrieb:
> mit Gewahlt

Wer die Wahl hat, hat die Wahl :-)

von Niklas G. (erlkoenig) Benutzerseite


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.

: Bearbeitet durch User
von Yalu X. (yalu) (Moderator)


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.

von Niklas G. (erlkoenig) Benutzerseite


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.

von Wolfgang (Gast)


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.

von ups (Gast)


Lesenswert?

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.


...

von Rolf M. (rmagnus)


Lesenswert?

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.

von Kaj (Gast)


Lesenswert?

Konstrukte wie _gamma sollten vermieden werden.
Das Hatten wir doch gerade schon:
Beitrag "Was bedeuten vorgestellte "underline"?"

von k-mte (Gast)


Lesenswert?

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

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

k-mte schrieb:
> die Berechnung der Innenwinkelsummen von Drei- und Vierecken.

return 180 bzw. return 360

SCNR

von leo (Gast)


Lesenswert?

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

von Rolf M. (rmagnus)


Lesenswert?

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

von leo (Gast)


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

von W.S. (Gast)


Lesenswert?

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.

von Niklas Gürtler (Gast)


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.

von Rolf M. (rmagnus)


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.

von Yalu X. (yalu) (Moderator)


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
}

von Wolfgang (Gast)


Lesenswert?

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?

von Einer K. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.