Visual Studio



  • Also ich habe Mir im I-net Microsoft Visual C++ 2005 express edition runtergeladen. darin habe ich folgendes programm geschreiben.

    #include <iostream.h>
    
    void main()
    {
    	int a,b,A,B;
    	b=8;
    
    	cout<<"Bitte geben sie ein Zahl ein"<<endl;
    	cin>>a;
    	cout<<endl;
    
    	while(A>0)
    	{
    		A=a/b;
    		B=a%b;
    		a=A;
    
    		cout<<a<<"/"<<b<<"="<<A<<"  | "<<B<<endl;
    	}
    }
    

    Jetzt zeigt er mir an das es ein unerwartetes datei ende bei der suche nach Vor-compilierten headern gab.

    Dieses Problem konnte ich bei Mircosoft Visual C++ Autorenedition einstellen.
    Da habe ich auf Projekteinstellungen geklickt.
    Dann auf C/C++
    Und dann bei Kategorie von Allgemein auf Vorkompelierte Headerdateien umstellen.
    Nun konnte ich den einen punkt da machen wo stand Vor-compilierte Headerdateien automatisch verwenden.
    Danach lief das programm.

    Leider gibt es das bei Mircosoft Visual Studio 2005 expres edition nicht.
    Hat einer ahnung wie ich das da mache?

    Soa. und noch ne zweite frage:
    Wieso soll man Using mainspace std;
    nutzen und wann schreibt man #include <iostream.h> und wann <iostream>?

    das habe ich nicht verstanden. Ich habe das hier im Forum bei einigen programmen gesehen. Aber in meinem Buch habe ich noch nichts darüber gefunden.
    da heist es immer #include <iostream.h> und Using mainspace std; gibts da auch nicht.

    ich bedanke mich schon mal für eure Hilfe

    Marian



  • wenn du ein neues Projekt erstellst, machst du einfach den haken bei use precompiled headers raus, dann sucht er auch nicht nach denen. man schreibt #include <iostream>, zumindest laut neuem standard. meines wissens. using namespace std schreibt man damit man nicht vor jedes std:: vor jedes cin und cout schreiben muss, weil diese im Namespace std enthalten sind.


  • Mod

    Sqwan schrieb:

    das habe ich nicht verstanden. Ich habe das hier im Forum bei einigen programmen gesehen. Aber in meinem Buch habe ich noch nichts darüber gefunden.
    da heist es immer #include <iostream.h> und Using mainspace std; gibts da auch nicht.

    das buch stammt offensichtlich noch aus der steinzeit. du kannst es getrost entsorgen.



  • Sqwan schrieb:

    Jetzt zeigt er mir an das es ein unerwartetes datei ende bei der suche nach Vor-compilierten headern gab.

    Dieses Problem konnte ich bei Mircosoft Visual C++ Autorenedition einstellen.
    Da habe ich auf Projekteinstellungen geklickt.
    Dann auf C/C++
    Und dann bei Kategorie von Allgemein auf Vorkompelierte Headerdateien umstellen.
    Nun konnte ich den einen punkt da machen wo stand Vor-compilierte Headerdateien automatisch verwenden.
    Danach lief das programm.

    Kleiner Tipp, versuche möglichst ohne vorkompilierte Header zu arbeiten. Solche bringen meiner Ansicht nach eher Ärger als Vorteile.

    Sqwan schrieb:

    Soa. und noch ne zweite frage:
    Wieso soll man Using mainspace std;
    nutzen

    Wer sagt das denn? Using Direktiven oder Deklarationen sind eher eine optionale Angelegenheit. Schau dir dazu am besten mal ein Tutorial über Namensräume an.

    Sqwan schrieb:

    und wann schreibt man #include <iostream.h>

    Nie!

    Sqwan schrieb:

    und wann <iostream>?

    Immer, wenn du entsprechende Stream Funktionalität brauchst, wie zB cout oder cin.

    Sqwan schrieb:

    Aber in meinem Buch habe ich noch nichts darüber gefunden.
    da heist es immer #include <iostream.h> und Using mainspace std; gibts da auch nicht.

    Dann ist das Buch veraltet und somit obsolete. Leg es schnell weg und besorge dir etwas Aktuelles.

    btw:
    Es heisst übrigens 'int main()'. Und du darfst ruhig Leerzeichen benutzen. 😉
    Korrekt würde dein Programm übrigens wie folgt aussehen:

    #include <iostream>
    using namespace std;
    
    int main()
    {
    	int a,b,A,B;
    	b=8;
    
    	cout << "Bitte geben sie ein Zahl ein" << endl;
    	cin >> a;
    	cout << endl;
    
    	while (A>0)
    	{
    		A=a/b;
    		B=a%b;
    		a=A;
    
    		cout << a << "/" << b << "=" << A << "  | " << B << endl;
    	}
    	return 0; // in main() optional
    }
    


  • Thx.
    Das hilft mir schon mal weiter.
    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.

    Wieso soll ich jetzt trotzdem int main nutzen?

    so sieht mein quellcode jetzt aus:

    #include <iostream>
    using namespace std;
    void main()
    {
    	ANFANG:;	
    	int a,b,c,A,B;
    	b=8;
    	A=1;
    
    	cout<<"Bitte geben sie ein Zahl ein"<<endl;
    	cin>>a;
    	cout<<endl;
    
    	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;
    	if(c==1)
    	{
    		goto ANFANG;
    	}
    }
    

    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.
    Das prob was ich jetzt habe hat allerdings nichts mehr mit dem compiler zu tuhen.

    Wenn das programm einmal durchgelaufen ist kann ich eins drücken und komme wieder an den anfang. Das geht auch. kann man so oft machen wie man will.
    Drückt man nicht 1 so endet das prog. Allerdings nur wenn man vorher nicht schon mal 1 gedrückt hat.
    Dann laufen in der ganzen eingabekonsole irgendwelche buchstaben durch.
    Kann mir noch einer sagen woran das leigen kann...

    MFG Marian
    PS: haben C++ grade erst angefangen (in der schule)



  • 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 
    };
    

    Völlig standardkonform und sogar noch weniger Schreibarbeit, weil int kürzer als void ist 😉

    goto ist hier auch nicht der Brüller, das sollte man nur einsetzen, wenn's *wirklich* nicht anders geht. Hattest du schon Schleifen?
    Falls nicht: http://tutorial.schornboeck.net/schleifen.htm

    Dann kann man das so schreiben:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
      int a,b,A,B;
      char c;
      do {
        b=8;
        A=1;
    
        cout<<"Bitte geben sie ein Zahl ein"<<endl;
        cin>>a;
        cout<<endl;
    
        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');
    }
    

    Leerzeichen tragen im Übrigen wirklich zur Übersichtlichkeit bei, genauso wie gute Variablennamen, oder weißt du in zwei Wochen noch, was denn der Unterschied zwischen A und a war 😉

    MfG

    GPC



  • 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