Visual Studio



  • Sqwan schrieb:

    mein lehrer sagt aber das man void main nehmen soll wenn man am ende des programmes keinen wert zurückgeben muss.
    int main() erwartet ein return 0;
    void main() nicht.

    Dein Lehrer hat keine Ahnung. Falls er dir nicht glauben will, rate ihm doch mal zu einem Blick in den C++ Standard.
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=main#Answ

    Wieso soll ich jetzt trotzdem int main nutzen?

    Weil alles andere falsch ist. Du hast Glück, dass das dein Compiler akzeptiert und sich nicht selbst zerstört (was er laut Standard zB machen dürfte, siehe Definition von "Undefined Behaviour")

    btw. benutz bitte vernünftige Topics/Titel, die auf dein Problem hinweisen!



  • GPC schrieb:

    Hallo,

    mein lehrer sagt aber das man void main nehmen soll wenn man am ende des programmes keinen wert zurückgeben muss.
    int main() erwartet ein return 0;

    sag deinem Lehrer er soll sich gefälligst an den C++ Standard halten. Der schreibt nämlich ein int main() oder ein int main(int argc, char *argv[]) vor. Im Übrigen wird am Ende von main automatisch 0 zurückgegeben, man kann also schreiben:

    int main() {
      //mein tolles Programme 
    };
    

    nein eigentlich sollte man genau das nicht schreiben, zumindest das letzte zeichen nicht. 😃



  • kingruedi schrieb:

    Weil alles andere falsch ist. Du hast Glück, dass das dein Compiler akzeptiert und sich nicht selbst zerstört (was er laut Standard zB machen dürfte, siehe Definition von "Undefined Behaviour")

    OT:
    Hm, kennst du nen Compiler, der einem das _wirklich_ übelnimmt und einen Fehler ausgibt oder in undefiniertes verhalten abdriftet? Mir fällt keiner ein.

    teeeee schrieb:

    GPC schrieb:

    int main() {
      //mein tolles Programme 
    };
    

    nein eigentlich sollte man genau das nicht schreiben, zumindest das letzte zeichen nicht. 😃

    Macht der Gewohnheit... tut keinem weh.



  • ok. dann eine letzte Frage:

    Wofür gibt es void?
    was ist das für ein type?

    Und schleifen haben wir noch nicht gemacht.
    Habe ich aber schon mindestens 1000 mal in php verwendet.

    was die sache mit dem Compiler angeht.
    mein Lehrer sagt Visual Studio ist ein Compiler.
    da ich probleme hate mit den einstellungen die ich vorher machen konnte,
    die aber überflüssig sind, habe ich gedacht das es in den bereich compiler reingehört...

    Ach ja. Doch noch ne Frage.
    Was genau hat denn jetzt dieses wirre durchlaufen von zahlen hervorgerufen?

    Auf jeden fall ein riesen thx an euch alle

    Marian



  • Marian-e schrieb:

    ok. dann eine letzte Frage:

    Wofür gibt es void?
    was ist das für ein type?

    void heisst im Prinzip "nichts", also wenn einer Funktion kein Wert übergeben werden soll, oder sie keinen zurückgibt, schreibt man anstatt int oder einem anderen Variablentyp einfach void. sonst musst du ja immer irgendwas übergeben wenn du z.b. void funktion(int zahl){} machst auch wenn du die variable zahl z.B. gar nicht brauchst, dann kannst du z.B. void funktion(void) schreiben.

    was die sache mit dem Compiler angeht.
    mein Lehrer sagt Visual Studio ist ein Compiler.

    ich denke die Sache mit deinem Lehrer haben wir mittlerweile geklärt, er hat keine Ahnung. Visual Studio ist eine Entwicklungsumgebung, also das was du siehst, wenn du es startest, zum code eintippen, projekte erstellen usw.

    da ich probleme hate mit den einstellungen die ich vorher machen konnte,
    die aber überflüssig sind, habe ich gedacht das es in den bereich compiler reingehört...

    kann ja mal vorkommen, dafür hat man Moderatoren.

    zum letzten: wenn du A=a/b machst wäre das eigentlich 1/8. Du hast A allerdings vom Typ int gewählt, also eine Ganzzahlvariable. 1/8 ist keine Ganzzahl, also wird A = 0 gesetzt. Probier mal A vom Typ float zu nehmen.



  • Sqwan schrieb:

    Was die Lehrzeichen angeht. Für michen ziehen die eine Zeile so sehr in die länge und machen sie deshalb für mich unübersichtlich.
    das ist warscheinlich aber geschmackssache.

    Klar ist es letztendlich Geschmackssache. Aber Leerzeichen sorgen idR eher für Übersichtlichkeit, als dass sie dem schaden. Bei Ausdrücken wie

    cout<<a<<"/"<<b<<"\t= "<<A<<"\t|"<<B<<endl;
    

    muss ich schon zweimal hinschauen, um die Literale, Bezeichner, Operatoren oder was auch immer zu entziffern. Das sorgt mit der Zeit nur für unnötige Kopfschmerzen. 🙂 Und wenn dich die Zeilenlänge stört, dann kannst du den Ausdruck ja auch auf mehrere Zeilen splitten. Zur Not auch so

    cout
        << a
        << "/"
        << b
        << "\t= "
        << A
        << "\t|"
        << B
        << endl;
    

    Es gibt auch Leute, die zB sprechende Operatoren verwenden. Also statt

    a && b
    

    sowas schreiben

    a and b
    

    Und die _müssen_ Leerzeichen verwenden, ansonsten hat der Compiler ein Problem. 😃

    GPC schrieb:

    Der schreibt nämlich ein int main() oder ein int main(int argc, char *argv[]) vor.

    Naja, ganz so schlimm ist es nicht. 🙂 Der Standard schreibt lediglich int vor. main() und main(int argc, char* argv[]) werden garantiert. Eine Implementation darf aber alles mögliche als Parameter aufnehmen, sofern sie Lust dazu hat.

    GPC schrieb:

    Hm, kennst du nen Compiler, der einem das _wirklich_ übelnimmt und einen Fehler ausgibt oder in undefiniertes verhalten abdriftet? Mir fällt keiner ein.

    GCC nimmt einem das übel. Mit der Version die ich hier habe (3.4.5) gibt's nen Fehler. MSC spuckt mit /Za zumindest eine Warnung aus. Ob es wirklich undefiniertes Verhalten gibt, wissen wohl nur die Compilerentwickler. Vorstellbar ist es aber durchaus, wenn in main kein entsprechendes return generiert wird, der damit undefinierte Rückgabewert durch die Runtime trotzdem ausgewertet wird.

    Marian-e schrieb:

    Wofür gibt es void?
    was ist das für ein type?

    void ist eigentlich kein "richtiger" Typ, so wie char oder int. Man kann void trotzdem dort verwenden, wo ein Typbezeichner erforderlich ist. void bedeutet letztendlich soviel wie "nichts" oder "unspezifizierter Typ".
    Mittlerweile weisst du ja, dass main() int zurückgeben muss. Das gilt natürlich nicht für andere Funktionen. Die können im Grunde zurückgeben was sie wollen. Eine Funktion, die void als Rückgabetyp hat, gibt einfach "nichts" zurück. Oder void* ist zB ein Zeiger auf "irgendwas". Man kann praktisch jeden Zeiger (Ausnahme sind Member- und Memberfunktonszeiger) an void* Variablen zuweisen. Wird allerdings in C++ eher nicht verwendet, da die Typisierung hiermit recht aufgeweicht wird.

    Marian-e schrieb:

    was die sache mit dem Compiler angeht.
    mein Lehrer sagt Visual Studio ist ein Compiler.

    Visual Studio ist kein Compiler. Es ist eine Entwicklungsumgebung ( ➡ IDE). Der integrierte Compiler für C bzw. C++ nennt sich Microsoft C/C++ Compiler, oder kurz MSC.

    Marian-e schrieb:

    Was genau hat denn jetzt dieses wirre durchlaufen von zahlen hervorgerufen?

    Undefiniertes Verhalten. Vermutlich gepaart mit einem amoklaufenden Ein- und Ausgabepuffer von cin und cout.
    Schauen wir uns in aller Ruhe mal die wichtigen Stellen an:

    int c; // Variable fuer Abbruchbedingung - uninitialisiert!
    //...
    cin>>c; // Abbruchbedingung wird durch die Benutzereingabe erfasst
    //...
    if(c==1) // Abbruchbedingung bedeutet also, alles ausser 1
    

    Wie man sehen kann, ist die Variable für die Abbruchbedingung vom Typ int. Liest man mit cin also keinen gültigen Wert ein, zB weil man Buchstaben eingibt, behält c seinen Wert, bleibt also uninitialisiert. Damit erzeugt man mit c==1 undefiniertes Verhalten, weil ein Wert, der alles mögliche sein kann, mit 1 verglichen wird. Sehr wahrscheinlich ist dieser nicht definierte Wert ungleich 1, was erklärt, warum das Programm endet, wenn man vorher nicht schon mal 1 gedrückt hat, und c dann einen definierten Wert besitzt.
    Wie löst man nun das Problem? Am einfachsten wäre wohl, wenn du c einfach bei der Definition initialisierst.

    int c = 0;
    

    Das sieht zwar nett aus, es bleibt aber immer noch das Problem mit der fehlerhaften Eingabe bei cin. int ist nun mal nicht der passende Typ, um alle möglichen Zeichen zu erfassen. Da nimmst du besser char oder für Zeichenketten std::string, zB

    char c = '0';
    //...
    cin>>c;
    //...
    if(c=='1')
    


  • Also nochmal eine frage zum prog.

    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
      int a,b,A,B,C; 
      char c;
    
      do {
    
    	A=1; 
    	cout<<"In welches system soll umgewandelt werden?"<<endl;
        cin>>b; 
    
        cout<<"Bitte geben sie ein Zahl ein"<<endl; 
        cin>>a;
    
    	if(b == '2')
    	{
    		cout<<"Bin in if"<<endl;
    		while(A>0) 
    		{ 
    			B=a%b; 
    			A=a/b;
    			if(B=='0')
    			{
    				C=1;
    			}
    			else if(B=='1')
    			{
    				C=0;
    			}
    			else
    			{
    				cout<<"Gibts nicht"<<endl;
    			}
    
    			cout<<a<<"/"<<b<<"\t= "<<A<<"\t|"<<B<<"\t|"<<C<<endl;
    
    			a=A; 
    		}
    	}
    	else
    	{
    		while(A>0) 
    		{ 
    			B=a%b; 
    			A=a/b; 
    			cout<<a<<"/"<<b<<"\t= "<<A<<"\t|"<<B<<endl;
    
    			a=A; 
    		}
    	}
    
    	cout<<endl<<endl<<"Press 1 to continue"<<endl; 
        cout<<"Press any other key for exit"<<endl; 
        cin>>c; 
        cout<<endl<<endl; 
      }while (c == '1'); 
    }
    

    Leider springt er bei 2 nicht in ide IF-Abfrage.
    Wenn ich b als char definiere springt er in die IF-Abfrage.

    Woran liegt das. Int is doch auf jedenfall eine Zahl.
    und char kann doch auch ne zahl sein,. Wieso gibts bei char rechenfehler obwohl er in der if-abfrage ist. und wieso geht er bei int nicht in die if-abfrage.

    kann mir das einer erklären?

    Thx schon mal im Vor raus
    Marian



  • Nach dem Einlesen steht in einem int eine Zahl drin, die kann negativ sein, die kann länger als eine Ziffer sein. In Deinem Fall ist die Zahl 2. Eine Ziffer, positiv, aber das ist Zufall. Du vergleichst in der while-Schleife ja auch nicht auf größer '0', sondern auf größer 0.

    Im char steht genau ein Zeichen drin, das kann die Ziffer '2', aber genausogut auch der Buchstabe 'b' sein. Und es ist immer ein Zeichen, nicht mehr und nicht weniger.



  • EDIT: Hä? Ich hab doch auf editieren geklickt?!
    Doppelpost.



  • THX. so klapst.

    Aber trotzdem wieder ne Frage.

    Wird in der Do-while schleife auf '0' geprüft weil ich char genommen habe und deshalb so wie so ein zeichen habe?


Anmelden zum Antworten