M_PI..... Fehlerhaftes Programm



  • schreibe da ein programm aber bekomme die meldung das es nicht bezeichet ist....

    erstmal das Programm:
    _____________________________ __

    #include "stdafx.h"
    #include <iostream>
    #include <math.h>
    #include <string>
    #define _USE_MATH_DEFINES 
    
    using namespace std;
    
    main()
    {
    double pi = M_PI; // hier ist der Fehler
    double rad;
    double fla;
    
    rad = 3;
    
    cout << "Programm zum berechnen des Flächeninhalt des Kreisens. " << endl << endl
    << "Radius = 3 cm" << endl;
    
    fla = pi * rad * rad; 
    
    // formel A = pi * r²                   |                   r² = r * r
    
    cout << "Der Flächeninhalt von Radius 3 cm ist " << fla ; 
    
    getchar();
    return 0;
    }
    

    _____________________________ _________

    so.. jetzt bingt der mir:

    Fehler 1 error C2065: 'M_PI': nichtdeklarierter Bezeichner

    Kann mir bitte da jemand helfen??

    was mache ich falsch?


  • Mod

    M_PI ist nicht Standard. Deine Standardbibliothek kennt es nicht und das darf sie auch so. Aus dem #define _USE_MATH_DEFINES in deinem Programm schließe ich, dass du vermutlich Visual Studio und dessen Standardbibliothek benutzt. Dort kann man mit diesem define die Unterstützung für M_PI und einige andere Konstanten aktivieren. Dann sollte das define aber natürlich vor das #include <math.h> (und in C++ heißt das gefälligst #include <cmath> !). Guck dir mal an, wie der Präprozessor funktioniert, dann verstehst du auch warum das so sein muss.

    P.S.: Und da wir schon beim Thema Standardkonformität sind: Default-int gibt es in C++ nicht mehr. Viele Compiler werden dir daher den Kopf deiner main-Funktion um die Ohren hauen. Das heißt int main !
    getchar kommt aus cstdio. Bei dir scheint das irgendein anderer Header einzubinden. Da hast du bloß Glück, verlassen kann man sich da drauf nicht. Außerdem habe ich den leisen Verdacht, dass getchar hier zwar tut, was du dir erhoffst, aber aus anderen Gründen als du vermutlich denkst. Später wird das schiefgehen. Guck mal in die FAQ vom Konsolenforum.



  • @SeppJ

    nutzte: Visual Studio 10.0

    zu main.. das hat das programm schon vorgegeben...

    das mit <math.h> hat mir einer gesagt....

    so mal sehen obs kappiert habe...:

    #include "stdafx.h" 
    #include <iostream> 
    #define _USE_MATH_DEFINES#include <cmath> 
    #include <string> 
    
    using namespace std; 
    
    int main() 
    { 
    double pi = M_PI; // hier ist der Fehler 
    double rad; 
    double fla; 
    
    rad = 3; 
    
    cout << "Programm zum berechnen des Flächeninhalt des Kreisens. " << endl << endl 
    << "Radius = 3 cm" << endl; 
    
    fla = pi * rad * rad; 
    
    // formel A = pi * r²                   |                   r² = r * r 
    
    cout << "Der Flächeninhalt von Radius 3 cm ist " << fla ; 
    
    getchar();// noch nicht überarbeitet
    return 0;
    

    da ich ja auch noch nicht lange programmiere weiß es halt nicht so genau!

    bisjetzt habe getchar() gelernt, dass das programm anhält..


  • Mod

    Jetzt hast du das #include <cmath> ganz vergessen.



  • also:

    #include "stdafx.h"
    #include <iostream>
    #define _USE_MATH_DEFINES 
    #include <cmath>
    

    ich sags glei.. so funktioniert es auch nicht



  • Die Standardheader dürfen sich gegenseitig einbinden, und ich vermute, dass das hier indirekt entweder durch <iostream> oder durch etwas in stdafx.h geschehen ist. In diesem Fall verhindern mit ziemlicher Sicherheit die Include-Guards in math.h, dass math.h nach der Definition des Makros erneut ausgewertet wird.

    Schreib die Makrodefinition halt ganz nach oben.


  • Mod

    Oder ganz klassisch und immer* funktionierend:

    #ifndef M_PI
    #define M_PI 3.1415926535897932
    #endif
    

    *: Außer irgendein Scherzvogel macht vorher #define M_PI 3.00 . 🤡



  • @seldon

    gesagt getan... es und noch mehr probleme:

    Warnung 1 warning C4627: "#include <cmath>": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.

    Warnung 2 warning C4603: "_USE_MATH_DEFINES": Das Makro ist nicht definiert, oder die Definition wurde nach Verwendung des vorkompilierten Headers geändert.

    Fehler 3 error C2065: 'M_PI': nichtdeklarierter Bezeichner



  • Zeig mal her, was du jetzt hast.



  • @SeppJ

    he das funktioniert 👍 💡

    noch was was nicht ganz hinneinpasst.. habe zwar angefangen.. kenne mich einn bissel mit funktionen und schleifen aus.. zeiger auch bekannt...

    aber kannste mal etwas empfelen für anfänger die dann auch weitergeht nach der consolenanwendungen

    aber ich glaube ich brauche auch was für consolen anwendungen da ich sicher nciht durch bin..


  • Mod

    Jesse schrieb:

    @seldon

    gesagt getan... es und noch mehr probleme:

    Warnung 1 warning C4627: "#include <cmath>": Wird bei der Suche nach Verwendung des vorkompilierten Headers übersprungen.

    Warnung 2 warning C4603: "_USE_MATH_DEFINES": Das Makro ist nicht definiert, oder die Definition wurde nach Verwendung des vorkompilierten Headers geändert.

    Fehler 3 error C2065: 'M_PI': nichtdeklarierter Bezeichner

    Na, steht doch recht direkt da: Wenn du die vorkompilierten Header benutzt ("stdafx.h"), dann werden weitere Einbindungen der Header ignoriert. Dadurch wird niemals das Symbol definiert, da es bei der Erstellung der vorkompilierten Header nicht existierte. Meine Empfehlung: Lass als Anfänger die vorkompilierten Header ganz weg. Bis deine Projekte so groß werden, dass du einen Unterschied merkst, werden noch Jahre vergehen. Andererseits sparst du dir Unannehmlichkeiten wie diese, wenn du sie nicht benutzt.

    Jesse schrieb:

    noch was was nicht ganz hinneinpasst.. habe zwar angefangen.. kenne mich einn bissel mit funktionen und schleifen aus.. zeiger auch bekannt...

    aber kannste mal etwas empfelen für anfänger die dann auch weitergeht nach der consolenanwendungen

    aber ich glaube ich brauche auch was für consolen anwendungen da ich sicher nciht durch bin..

    Ich verstehe diese Sätze nicht, aufgrund ihrer sprachlichen Mängel.



  • SeppJ schrieb:

    Ich verstehe diese Sätze nicht, aufgrund ihrer sprachlichen Mängel.

    Noch etwas, was nicht ganz dazupasst.. ich habe zwar angefangen, kenne mich auch ein bisschen mit Funktionen, Schleifen und Zeigern aus, aber könntest du mir mal etwas für Anfänger empfelen, das auch weitergeht nach den Konsolenanwendungen. Ich glaube, dass ich auch ein wenig Hilfe, bzw. ein Tutorial (spezifisch) für Konsolenanwendungen brauche, da ich sicher noch nicht durch bin..

    🤡


  • Mod

    Hacker schrieb:

    SeppJ schrieb:

    Ich verstehe diese Sätze nicht, aufgrund ihrer sprachlichen Mängel.

    Noch etwas, was nicht ganz dazupasst.. ich habe zwar angefangen, kenne mich auch ein bisschen mit Funktionen, Schleifen und Zeigern aus, aber könntest du mir mal etwas für Anfänger empfelen, das auch weitergeht nach den Konsolenanwendungen. Ich glaube, dass ich auch ein wenig Hilfe, bzw. ein Tutorial (spezifisch) für Konsolenanwendungen brauche, da ich sicher noch nicht durch bin..

    Dann die Antwort an Jesse: Das ist nix. Funktionen, Schleifen und Zeiger ist vielleicht gerade mal genug, um eine C-Bibliothek so halbwegs zu benutzen. So wie du schreibst, kennst du kein einziges der Konzepte die C++ von C abheben. Wenn du über die Konsole hinaus willst, wirst du Bibliotheken benutzen müssen. Wenn diese Bibliotheken für C++ gemacht sind (Es gibt auch welche für C, damit solltest du zurecht kommen, wenn das stimmt, was du sagst. Aber das wird unnötig umständlich), dann werden sie viele dieser Sprachmittel benutzen, die dir gänzlich unbekannt sind. Du scheinst nicht einmal die Standardbibliothek von C++ zu kennen (die diese Konzepte in Teilen auch sehr stark nutzt).



  • Du kannst Dir pi auch einfach mit double const PI = std::acos(-1.) vom Compiler ausrechnen lassen. Sind die trigonometrischen Funktionen in C++11 eigentlich constexpr ?


  • Mod

    Tachyon schrieb:

    Du kannst Dir pi auch einfach mit double const PI = std::acos(-1.) vom Compiler ausrechnen lassen. Sind die trigonometrischen Funktionen in C++11 eigentlich constexpr ?

    Keine Ahnung zu der formalen Regelung in C++11, aber normalerweise setzen Compiler die trigonometrischen Funktionen direkt ein, wenn der Ausdruck konstant ist. Du wirst feststellen, dass man in der Regel nicht die Mathe-Bibliothek mitlinken muss (in C++ sowieso nicht, ich meine C-Compiler), wenn die Ausdrücke alle konstant sind.



  • Tachyon schrieb:

    Du kannst Dir pi auch einfach mit double const PI = std::acos(-1.) vom Compiler ausrechnen lassen. Sind die trigonometrischen Funktionen in C++11 eigentlich constexpr ?

    Wieso? IMO wären da Makros besser aufgehoben...


  • Mod

    Hacker schrieb:

    Wieso? IMO wären da Makros besser aufgehoben...

    Was siehst du denn als Vorteil eines Makros?



  • Edit ^4:
    Ne, lieber Funktionen und constexpr. Makros sind nicht schneller.



  • Hacker schrieb:

    Edit: Ah, ihr meint Funktionen! Da muss ich kurz nachdenken, aber da isses natürlich was anderes

    In allen Fällen wären Makros keine gute Wahl gewesen...



  • gfhfgh schrieb:

    Hacker schrieb:

    Edit: Ah, ihr meint Funktionen! Da muss ich kurz nachdenken, aber da isses natürlich was anderes

    In allen Fällen wären Makros keine gute Wahl gewesen...

    Stimmt, die sind ja auch nich typsicher, nicht?


Anmelden zum Antworten