1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

C++ auf dem Terminal...

Dieses Thema im Forum "Unix & Terminal" wurde erstellt von Cyrics, 20.10.05.

  1. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    Huhu,

    ich wollte ein bisschen auf meinem iBook C++ programmieren und es scheitert schon an den kleinsten Dingen...

    es kommt nicht mal mit cout und endl klar!

    als kleines Beispiel:
    Code:
    #include <iostream>
    void main()
    { cout<<"hello world"<<endl;
    };
    also das simpelste Beispiel überhaupt! Ich dachte ja erst, dass es an der iostream scheitern würde, oder der C++-Compiler nicht installiert, aber gcc4 ist installiert und joa... ich hab keine Ahnung woran es scheitert ;)

    die Datei ist unter new.cpp gespeichert, und ich hab es versucht sowohl mit g++ als auch mit normalen gcc zu kompilieren.
    es kommt immer die Fehlermeldung, dass cout und endl unbekannt sind und manchmal auch ein bisschen Abwechslung, dass er main gerne mit int deklariert hätte.

    Habt ihr eine Idee woran es liegt, dass es auf dem iBook scheitert aber auf Linux-PCs alles ohne zu murren angenommen wird?

    vielleicht bin ich ja auch nur zu doof den Fehler zu sehen! Danke schonmal :-[
     
  2. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    02.04.04
    Beiträge:
    411
    So musses lauten:
    Code:
    #include<iostream>
    
    using namespace std;
    
    int main()
    {
    	cout<<"hello"<<endl;
    }
    
    Du musst den Namensraum std einbinden oder so verfahren:
    Code:
    //--snipp
    std::cout<<"hello world"<<std::endl;
    //--snipp ende
    
    dann klappts auch :).

    Desweiteren, das ; nach der } war sicherlich ein Tippfehler oder?
     
  3. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    oha... das ist ja komplett anders *amkopfkratz*
    liegt das nur am OSX-Terminal, oder funktioniert dies nun auch mit dem Linux-Compiler (obwohl es ja glaub ich der selbe ist...)

    wenigstens wurde der oben genannte Code ohne Probleme von Fedora-G++ geschluckt und von Mac-G++ abgelehnt.

    Gibt es eine Übersicht was man beachten sollte bei C unter OSX?

    und das mit dem ; war eigentlich schon richitg gesetzt... wie gesagt: unter linux schluckt er es ja ohne zu murren ;)

    Trotzdem Danke!!
    Nun bin ich wenigstens schlauer, dass C unter OSX total anders ist als unter Linux... o_O
     
  4. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    02.04.04
    Beiträge:
    411
    Das ist ganz normales C++ nach ISO Norm

    (aus der Wiki)

    ich kenns auch nicht anders, abgesehen von Borland.

    btw., willst Du nun C oder C++ programmieren ?
     
  5. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    also sowohl C als auch C++ *g*
    ich hab vorher nur ein paar Erfahrungen gemacht gehabt.... und wollte nun einfach mal schaun wie es unter C++ läuft. Und da tauchten von anfang an diese Problemchen auf, die ich unter Linux nicht hatte...

    ich vermisch nun leider viel zu oft C und C++, weil ich immer denke, dass beide sich nicht viel nehmen und C++ nur noch ein paar Befehle mitbringt ;)
    aber dem scheint wohl nicht so... weisst du zufällig ein tutorial, dass die von dir beschriebene "Technik" aufzeigt und lehrt? Ich find nämlich nur Tutorials, die den oben beschriebenen Code als C++ ausgeben. Und der läuft ja nicht so, wie ich das gerne hätt! :(
     
  6. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    02.04.04
    Beiträge:
    411
    Tutorial nicht direkt, da ich das in der Uni groesstenteils gelernt hab. Was ich dir aber empfehlen kann, ist dieses buch.

    Eventuell ist diese Seite auch was fuer Dich.
     
  7. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    aah, das Buch hatte ich auch schon im Auge :)

    das lustige ist! Das diese Seite die du mir zeigst, genau die Seite ist, die ich heute ein bisschen durchblättert habe... aus Lust und Laune hab ich beim ersten Tutorial gleich das erste Hello World mal abgetippert... unter Linux hats geklappt, unter OSX nicht... egal!
    ich hab mir das Buch jetzt auch mal geholt, weil ich es mir eh mal holen wollte *g*

    wo studierst du denn in Leipzig, dass du C++ programmieren lernst/lerntest?! :)
    Nicht zufällig an der Telekom FH? *gg*
     
  8. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Nein, das ist der Unterschied zwischen ISO C++ und irgend einem Prä ISO C++. Der neue gcc 4.0 reagiert unter Linux genauso!

    Also, wenn Du C++ mit dem g++ lernen willst am besten die Optionen -Wall -std=c++98 benutzen, zum Testen ruhig auch mal --pedantic nehmen. Grundsätzlich sollte man für neue C++ Programme mehr keinen gcc vor 3.x nehmen. Ideal ist der 3.4.x oder 4.0.x.

    Das korrekte Beispiel ist
    Code:
    #include <iostream>
    
    int main () {
        std::cout << "Hello World!" << std::endl;
    }
    
     
  9. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    O Gott! Nicht diese grottenschlechten O'Reilly C++ Büchern! Es gibt wohl keine schlechteren Bücher zum Thema C++. Sie sind uralt und ISO C++ ist für sie ein Fremdwort.

    Das hier gilt als zur Zeit bestes Einsteigerbuch zum Thema C++
    http://www.awprofessional.com/title/020170353X
    Buchrezensionen zu englischsprachigen Büchern finden sich unter anderem auf
    http://www.accu.org/
     
  10. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Das ist nicht egal! Das Tutorial taugt nichts, da es sich nicht an die ISO Norm hält und irgend einem Kram Dir beizubringen versucht, der nun einmal nicht zur ISO Norm konform ist. Gerade als Anfänger sollte man nicht mehr veraltete Sprachkonstrukte lernen. Die Norm ist immerhin aus dem Jahr 1998, die Überarbeitung (nur kleine Fehlerkorrekturen) stammt aus dem Jahr 2005.
     
  11. Demo

    Demo Süssreinette (Aargauer Herrenapfel)

    Dabei seit:
    02.04.04
    Beiträge:
    411
    hast Du in dieses "grottenschlechte" Buch schonmal reingeschaut ? Das ist schlussendlich bei jedem persoenlich anders - mal immer ruhig mit den Pferden.

    Nein,dort nicht - aber das war nebenan an der HTWK. Leider ist der Prof in den wohlverdienten Ruhestand und die Jungs machen dort jetzt Java. (Studiengang Wirtschaftsmathematik, bei den Informatikern weiss ich das nicht)
     
  12. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    oha, da gehen wohl die Welten auseinander *g*

    also danke auf jeden Fall fürs Aufklären wegen dem ISO-Standard. Nun ist mir alles schon viel klarer :)
    Wäre ja schon daran interessiert den neusten Standard zu lernen und nicht den älteren.
    Jetzt ist mir auch alles klar, weil dann auf dem PC wohl noch der alte Compiler schlummert von pre 3.4er Zeiten!
    und auf meinem iBook dagegen die 4.0er Version.
    dann werd ich mir mal beide Bücher näher anschauen und auch guucken was für mich zukünftig eher geeignet ist!

    Vielen Dank auf jeden Fall für die Meinungen!

    *nun nach einem aktuellen Tutorial suchen geh* *g*
     
  13. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Wie ich gerade sehe, ist das die Übersetzung einer 2. Auflage des englischen Originals.
    Die erste englische Auflage ist sehr sehr schlecht (wie schlecht kann man kaum zum Ausdruck bringen. Das verfestigte das Urteil nie wieder ein Buch des Autoren in die Hand zu nehmen). Das Inhaltsverzeichnis überzeugt mich bei der neuen Auflage nicht wirklich. Es gehört mittlerweile zum guten Ton, gleich die Standard Library von C++ zu benutzen und sie nicht im Anhang aufzuführen. Das Probekaptibel der deutschen Auflage ist nicht wirklich aussagekräftig, aber es scheint so, als ob sie endlich entdeckt hätten was die ISO C++ Norm ist. Das einzig negative was mir auffiel sind die Klammern bei den return Statements.

    Es scheint zumindest bedingt tauglich zu sein.
     
  14. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Als Standardwerke zur C++ Programmierung gelten:
    C++ Primer, Lippman
    The C++ Programming Language (Special Edition, etwas schwierig zu lesen)
    The C++ Standard Library, Josuttis (Referenz zu Standard Library)
    C++ Templates, Vandervoorde, Josuttis (Templates ausführlich erklärt)
    Modern C++ Design, Alexandrescu (Kombination von Templates und Design Patterns)
    Exceptional C++, Sutter
    Effective C++, Meyers

    Von einigen Büchern gibt es deutsche Übersetzungen. Es dauert recht lange bis man einigermaßen C++ programmieren kann. Gerade die Kombination von Design Patterns und C++ sowie die grundlegenden Programmiertechniken brauchen ihre Zeit.

    Sutters Büchern führen immer wieder in kleinen Codebeispielen einem vor Augen, wie man "exception save" und "exception neutral" Code schreibt. Nichts für den blutigen Anfänger, aber sehr wichtig und sehr empfehlenswert um die Stärken von C++ kennenzulernen.
     
  15. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    na ich bin erstmal froh, wenn ich C++ einigermaßen einwandfrei im einfachen Sinne mit dem ISO C++ programmiert krieg *g* danach kann man gerne mal schaun was sich weiter ausbauen lässt.
    Aber erstmal geht es darum Grundlagen zu schaffen und zu festigen :)

    Trotzdem Danke! Vielleicht kann ich ja in 2 Jahren zu der höheren Literatur greifen *g*
     
  16. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Mach Dich mit RAII vertraut, das ist eine Programmiertechnik, die einem viel Ärger erspart. Wenn Du Speicher oder andere Resourcen allozierst, definiere immer Konstruktor, Destruktor, Kopierkonstruktur und Zuweisungsoperator. Wenn man anschließend in Sutters Bücher schaut, dann weiß man auch, warum RAII in C++ so gepflegt wird.

    Außer zum Lernen versuche erstmal nicht das Rad neu zu erfinden und benutze die Standard Library. Wenn diese nicht weiterhilft, dann ist http://www.boost.org/ ein guter Tip. Einiges von Boost wird in die nächste Version der ISO Norm einfließen.

    P.S. Alle von mir aufgeführten Bücher beschäftigen sich ausschließlich mit ISO C++ und Programmiertechniken, die darauf aufbauen. C++ ist eine komplizierte und anspruchsvolle Sprache, erwarte nicht, daß Du sie in ein paar Tagen lernen könntest. Die wichtigsten Dinge reichen für den Anfang.

    P.S.2 Templates sind Turing vollständig, d.h. bis auf Compilerbeschränkungen hat man mit den Templates eine Metaprogrammiersprache zur Verfügung. Man kann daher mit Templates sehr interessante Dinge machen, aber es wird nahezu beliebig kompliziert.
     
  17. LaK

    LaK Reinette Coulon

    Dabei seit:
    30.03.05
    Beiträge:
    953
  18. Cyrics

    Cyrics Neuer Berner Rosenapfel

    Dabei seit:
    01.04.05
    Beiträge:
    1.975
    also welches Tutorial mir sehr gut hilft (und welchen diesen neuen ISO-Standard beinhaltet) ist hier zu erreichen. (ist der Link zu einer Druckversion ;) )
     
  19. tjp

    tjp Baldwins roter Pepping

    Dabei seit:
    07.07.04
    Beiträge:
    3.251
    Auch das Tutorial ist fehlerhaft und vermittelt einen schlechten Stil.

    Es wird in allen Beispielen in den Konstrukuren Zuweisung der besseren Initialisierung benutzt. Dasselbe gilt für Parametern von Funktionen, sie sind obwohl sie in der Funktion nicht verändert werden allesamt nicht als "const" deklariert. Das Beispiel mit den Link Lists ist schlichtweg fehlerhaft, und enthält ein potentielles Speicherloch, da man via Assignment Operator und CopyConstructor die Objekte kopieren kann und sie die Speicherverwaltung der Klasse aushebelt.

    Das Beispiel aus der Abschnitt Klassen wäre so besser formuliert
    Code:
    #include <iostream>
    
    class Computer {
        int processorSpeed;
    public:
        Computer () : processorSpeed (0) {};
        explicit Computer (int const speed) :
            processorSpeed (speed) {};
        void setSpeed (int const speed);
        int const getSpeed () const;
    };
    
    void Computer::setSpeed (int const speed) {
        this->processorSpeed = speed;
    }
    
    int const Computer::getSpeed () const {
        return this->processorSpeed;
    }
    
    int main () {
        Computer compute (100);
    
        std::cout << compute.getSpeed () << "\n";
    }
    
    Als erstes hat es keinen Sinn das Feld processorSpeed protected zu definieren, da wir einen vollständingen Satz an Setter-/Getter-Funktionen haben, und erstmal auch von dieser Klasse nicht ableiten wollen. Alle Klassenfelder/-funktionen ohne explizite Angabe der Zugriffrechte sind "private", bei structs ist der betreffende implizite Zugriffsmodus "public".

    Es ergibt weiterhin keinen Sinn einen eigenen Destruktor zu definieren, da in ihm eh nichts getan wird. Dafür ist es sinnvoll neben einem eigenem Standard Konstruktor, der das Feld processorSpeed mit 0 initialisiert, einen zusätzlichen Konstruktor mit einem int Parameter zu definieren. Da dieser Parameter nicht im Konstruktor verändert wird ist er "const" deklariert. Das Wörtchen "explicit" vor diesem Konstruktor gibt an, daß er nicht zur impliziten Konversion eines "int" Wertes in ein "Computer" benutzt werden kann. Die beiden Konstruktoren sind inline definiert und benutzen Initialisierung.

    Grundsätzlich sind Konstruktoren mit einem Parameter dazu geeignet als implizite Konversions Konstruktoren zu dienen. In diesem Fall wäre das nicht sinnvoll -> explicit.

    Die Methode setSpeed setzt das Feld processorSpeed auf den Wert von speed. Speed ist wieder ein konstanter Parameter. Das "this->" ist optional und kann weggelassen werden. this ist ein impliziter Zeiger auf das Objekt, dessen Methode gerade aufgerufen wird.

    Die letzte Methode getSpeed ist als konstanter Methode definiert (das gibt das "const" hinter der Parameter Definition an). D.h. diese Methode ändert keine Objekte vom Typ Computer. Die Funktionen hat einen non void Rückgabeparamter der zu dem auch noch "const" ist, die Bedeutung warum man in diesem Fall den Rückgabewert ebenfalls "const" deklariert erschließt sich erst bei komplexen Ausdrücken.

    So richtig C++ ist ja die main Funktion ja nicht. Damit es richtig nach C++ aussieht definiert man noch eine zusätzliche Methode von Computer.

    Code:
    #include <ostream>
    
    ...
        std::ostream& operator<< (std::ostream& out) const;
    ...
    
    
    std::ostream&
    Computer::operator<< (std::ostream& out) const {
        out << this->processorSpeed;
        return out;
    }
    
    int main () {
        Computer compute (100);
    
        std::cout << compute;
    }
    
     

Diese Seite empfehlen