probleme mit einer do-while schleife



  • Ich schreibe zur Zeit ein Programm in C++. Damit das Programm mehrmals abläft habe ich eine do-while Schleife erstellt.Jedoch wenn es kompiliieren soll, habe ich das Problem, das dim Kopiler Log steht, dass es bei dem while Wert ein Problem gibt: "comparison between distinct pointer types `double ()(int, double)' and `const char' lacks a cast"
    mein Code ist:

    int main (void);
    {
    do 
    {
    //Hauptprogramm... 
    cout<<"M"<<(char)148<<"chten sie wieder von vorne anfangen? (1=ja)";
    char jn;
    cin>>jn; cout<<endl<<endl<<endl<<endl;
    }
    while (jn=="1");
    cout<<"Das Programm wird nun geschlossen."; system("PAUSE");
    return 0;
    }
    

    Das Problem ist halt, dass ich das Programm nicht kompiliieren kann. Habt ihr eine Idee, was falsch ist?

    Dazu habe ich noch eine andere Frage. Wie bzw. wo lege ich den locale wert fest? Also wie schreibe ich ihn? Z.Zt. habe ich

    setlocale (LC_ALL, "de_DE");
    

    als erste zeile im int main,jedoch hat das keine auswirkung, zum Beispiel wenn man Zahlen eingeben muss, kann man bei long double Werten keine Kommas benutzen. (locale.h ist included)
    Was kann ich hier machen?

    Bis dann Crysis_02


  • Mod

    "1" ist eine Zeichenkette aus dem Zeichen '1' und dem Zeichen '\0'
    '1' ist das Zeichen für die Ziffer Eins.

    Locales: Du hast da anscheinend eine Anleitung für C gefunden. Du willst vermutlich
    http://www.cplusplus.com/reference/std/locale/
    Aber ich nehme mal an, dass du davon kein Wort verstehst. Was willst du bei diesem Programm mit einem Setzen der locale erreichen?



  • Ah ok. Dann werde ich das mal morgen mit der 1 ändern.

    Mit der locale will ich erreichen, dass man bei kommazahlen ein Komma statt Punkt eigeben muss



  • hinter dem main() steht ein semikolon, das gehört da nicht hin (oder?)...die sache mit main(void) habe ich auch noch nicht gesehen, bisher habe ich nur main(String args, char* argv[]) gesehen...das sieht in meinen augen etwas komisch aus.



  • @R.Paul W.
    main(String args, char* argv[]) habe ich auch noch nie gesehen xDDD

    int main(int argc, char* argv[]);



  • Jo. Muss der code aufm handy noch falscher sein xD ja der ist richtig:
    int main(String args, char* argv[]

    Und gibt es eine möglichkeit anstatt punkten kommas zu benutzen(bei Kommazahlen)? Und wenn ja wie mache ich das?



  • Crysis_02 schrieb:

    ja der ist richtig:
    int main(String args, char* argv[]

    Nein, der ist total falsch.

    Crysis_02 schrieb:

    Und gibt es eine möglichkeit anstatt punkten kommas zu benutzen(bei Kommazahlen)? Und wenn ja wie mache ich das?

    Beispiel:

    #include <locale>
    
    struct myFacet : public std::numpunct<char>
    {
            char do_decimal_point() const {return ',';}
    };
    
    #include <iostream>
    #include <sstream>
    #include <iterator>
    
    int main()
    {
            std::istringstream stream("3,451");
    
            stream.imbue(std::locale(std::locale(), new myFacet));
    
            std::cout << *std::istream_iterator<float>(stream);
    }
    

    Ideone: http://ideone.com/nYP0T

    Du leitest also von dem gewünschten facet ab (Z. 3-6) und erstellst ein entsprechendes locale (Z. 16, temporär). Dieses imbue() st du dann in den Stream (Z. 16), der modifiziert werden soll (das kann auch cin , oder cout usw. sein). Das wars.

    P.S.: Wenn du dieses facet für locales mit wcin verwenden möchtest, musst du alle Vorkommnisse von char durch wchar_t ersetzen, und ',' durch L',' .



  • Ok dann werde ich ds mal. so ausprobieren.

    Und wie muss ich den main tag definieren?

    Wie ihr merkt bin ich grade ganz am anfang bein programmieren.



  • Crysis_02 schrieb:

    Wie ihr merkt bin ich grade ganz am anfang bein programmieren.

    Oh, tut mir Leid!
    Der Standard sagt:

    N3337 3.6.1/2 schrieb:

    All implementations shall
    allow both of the following definitions of main:

    int main() { /* ... */ }
    

    and

    int main(int argc, char* argv[]) { /* ... */ }
    


  • Ja wenn ich nach hause komme veränder ich das mal und melde ich dann wenn ich noch probleme habe dann melde uch mich noch mal.



  • So nachden es sich nicht gebessert hat, poste ich hier einfach mal mein Programm rein. Es ist nicht so ordentlich aber ist ja nicht so schlimm hoffe ich mal.

    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    #include <locale.h>
    #include <istream>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        do
        {
        long double pixcox;
        long double pixcoy;
        cout<<"Haben Sie das Bild gespiegelt?"<<endl;
        system("PAUSE");
        cout<<"Bitte geben Sie den x-Koordinaten-Wert an (pixel-Wert):";
        cin>>pixcox;
        cout<<"Bitte geben Sie den y-Koordinaten-Wert an (pixel-Wert):";
        cin>>pixcoy;
        long double numcox ((512-pixcox)*(-1));
        long double numcoy (512-pixcoy);
        if (numcox == -0 and numcoy == 0)
        {
            cout << "Die Koordinaten nach dem Buchmuster sind (" <<numcox*(-1)<<"|"<<numcoy<<")"<<endl;
        }
        else
        {
            cout << "Die Koordinaten nach den Buchmuster sind: (" <<numcox<<"|"<<numcoy<<")"<<endl;
        }
        long double radPM (hypot(numcox, numcoy));
        cout <<"Der Radius (in Pixeln) vom sichtbaren Sonnenmittelpunkt ist:" << radPM <<endl;
        long double theta01 (numcoy/numcox);
        long double theta02 (atan(theta01));
        long double thetass (theta02*180/3.1415926);
        cout<<"Der Theta' Wert ist:"<<thetass<<" Grad"<<endl;
        long double thetas;
        if (numcox > 0 and numcoy > 0)
        {
                    thetas = thetass + 0;
        }
        else if  (numcox < 0 and numcoy > 0)
        {
             thetas = thetass + 180;
        }
        else if (numcox <0 and numcoy < 0)
        {
             thetas = thetass + 180;
        }
        else if (numcox > 0 and numcoy < 0)
        {
             thetas = thetass + 360;
        }
        long double p;
        cout<<"Bitte geben Sie den P-Wert ein:";
        cin>>p;
        long double theta (180-thetas-p);
        cout<<"Der Theta-Wert ist:"<<theta<<endl;
        long double B0;
        long double L0;
        cout<<"Bitte geben Sie den B0-Wert ein:";
        cin>>B0;
        cout<<"Bitte geben sie den L0-Wert ein:";
        cin>>L0;
        long double bg (180*3.1415926);
        long double rho (asin((radPM/512)/bg));
        long double bbogen (asin(cos(rho/bg)*sin(B0/bg)+sin(rho/bg)*sin(theta/bg)*cos(B0/bg)));
        long double bogen ((bbogen*180)/3.1415926);
        cout<<"Der Sonnenfleck liegt auf einer Breite von "<<bogen<<"Grad"<<endl;
        long double bAZM (asin(cos(theta/bg)*sin(rho/bg)/cos(bogen/bg)));
        long double AZM ((bAZM*180)/3.1415926);
        long double L (L0 + AZM);
        if (L>360)
        {
                     L =(L-360);
        }
        else
        {
            L=L;
        }  
        cout<<"Der Sonnenfleck liegt auf einer L"<<(char)132<<"nge von "<<L<<"Grad"<<endl<<endl;
        cout<<"Die Koordinaten sind   ("<<bogen<<"|"<<L<<")"<<endl<<endl<<endl;
        cout<<"M"<<(char)148<<"chten sie wieder von vorne anfangen? (1=ja)";
        long double jn;
        cin>>jn;
        cout<<endl<<endl<<endl<<endl;
        }
        while (jn=='1');
        cout<<"Das Programm wird nun geschlossen.";          
        system("PAUSE");
        return 0;
        }
    

    Weiterhin habe ich die Frage, ob man beim Kosius den Input wert auch als Bogenmass eigeben muss?

    Ja ich das mit den locale nicht so richtig verstanden habe, würde ich gerne mal IDIOTENSICHER erklärt haben, wo ich diesen hinschreibe, bzw. in den og. Programm einfüge.

    PS: Ich bin leider nicht so der hellste Kopf in C++ also bitte nicht aufregen.



  • Ja, die ganzen Kreisfunktionen arbeiten mit Bogenmaß.
    Wozu locale? Du bist noch recht neu in C++ und ich würde dir zuerst raten, andere Sachen zu lernen.

    gruß
    syntax



  • Ich finde das mit dem locale ist einfach einfacher einzugeben 😃 das Programm ist ja nicht nur für mich. Ich habe trotzdem eine Frage.

    Ich kann das Programm nicht kompiliieren, da ich an der while Schleife hängen bleibe. Da steht:
    "ISO C++ forbids comparison between pointer and integer"

    Ich habe doch aber gar keine pionter.



  • Fehlermeldung an welcher Stelle?

    gruß
    syntax



  • roflcopter schrieb:

    @R.Paul W.
    main(String args, char* argv[]) habe ich auch noch nie gesehen xDDD

    int main(int argc, char* argv[]);

    upps ja 😃 hab mich vertippt 😃



  • die Fehlermeldung bei dem

    while (jn=='1')
    

  • Mod

    Crysis_02 schrieb:

    die Fehlermeldung bei dem

    while (jn=='1')
    

    Das dürfte überhaupt nicht funktionieren, da es das jn in dem Kontext überhaupt nicht gibt (und wenn es das gäbe, dann wäre ein Vergleich von long double und char ziemlich ungewöhnlich. Du solltest wirklich mal die Grundlagen gründlicher lernen anstatt an locales zu denken. Bei dir fehlt da noch viel.

    Die Fehlermeldung deutet darauf hin, dass der Quellcode so nicht vollständig ist und es von irgendwoher noch ein globales Symbol Namens jn gibt.



  • Ok, jn und long double kann ich weglassen 😃

    Wenn du aber für jn schon mit Zeichen vergleichst, kannst du auch gleich die Zeichen 'j' bzw 'n' nehmen.

    Andererseits kannst du jn auch als int definieren.
    Dann usst du den Vergleich aber mit dem Wert 1 und nicht mit dem Zeichen '1' machen



  • gut lassen wir das mal mit den locales weg.

    Geht es denn nicht den Wert in do-Sektor festzulegen und dann bei while überprüefn zu lassen? Ich habe mal die Bezeichnung is janein geändert und jetzt bekomme ich halt den Fehler "`janein' undeclared (first use this function)"

    //Anfang und Hauptprogramm
        cout<<"M"<<(char)148<<"chten sie wieder von vorne anfangen? (1=ja)";
        long double janein;
        cin>>janein;
        cout<<endl<<endl<<endl<<endl;
        }
        while (janein=='1');
        cout<<"Das Programm wird nun geschlossen.";          
        system("PAUSE");
        return 0;
        }
    

    Oder wie kann mal sonst eine Schleife einbinden, dass das Programm wieder von vorne anfangen lässt?
    Bitte mit Beispiel 😉



  • Du musst die Variable vor do definieren. Stichwort Gültigkeitsbereich.

    Achja: du definierst eine long double, initialisierst sie nicht und überprüfst aber dann auf =='1'? Lass dir das nochmal durch den Kopf gehen 😉

    gruß
    syntax


Log in to reply