mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: k-mte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Nein!

Autor: georg (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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

Autor: Timm R. (Firma: privatfrickler.de) (treinisch)
Datum:

Bewertung
-1 lesenswert
nicht 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:
#include<stdio.h>

struct {
    int gamma;
} globals = {.gamma = 42};

int main() {
   printf("Antwort", globals.gamma);
}

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
Autor: S. Landolt (Gast)
Datum:

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

Autor: Random .. (thorstendb) Benutzerseite
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Analog zu C++: m_member:

double g_gamma;

: Bearbeitet durch User
Autor: $$$ (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Michael B. (laberkopp)
Datum:

Bewertung
-1 lesenswert
nicht 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
Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: npn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> mit Gewahlt

Wer die Wahl hat, hat die Wahl :-)

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niklas G. (erlkoenig) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Wolfgang (Gast)
Datum:

Bewertung
-3 lesenswert
nicht 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.

Autor: ups (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.


...

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kaj (Gast)
Datum:

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

Autor: k-mte (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
k-mte schrieb:
> die Berechnung der Innenwinkelsummen von Drei- und Vierecken.

return 180 bzw. return 360

SCNR

Autor: leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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."

Autor: leo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: W.S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niklas Gürtler (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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:

#include <stdio.h>
#include <math.h>

#define   Γ tgamma
#define lnΓ lgamma

int main(void) {

  printf("Innenwinkel im Viereck\n");
  printf("  α β γ in °: ");
  double α, β, γ;
  scanf("%lf %lf %lf", &α, &β, &γ);
  printf("  δ = %.1f°\n", 360.0 - α - β - γ);

  printf("\nΓ-Funktion\n");
  printf("  x: ");
  double x;
  scanf("%lf", &x);
  printf("     Γ(x) = %.4g\n",   Γ(x));
  printf("  ln Γ(x) = %.4g\n", lnΓ(x));
}

Autor: Wolfgang (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Arduino Fanboy D. (ufuf)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.