• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

C++ auf dem Terminal...

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
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 :-[
 

Demo

Süssreinette (Aargauer Herrenapfel)
Registriert
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?
 

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
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
 

Demo

Süssreinette (Aargauer Herrenapfel)
Registriert
02.04.04
Beiträge
411
Das ist ganz normales C++ nach ISO Norm

Die C++-ISO-Norm schreibt vor, dass das Ergebnis von main vom Typ int sein muss. Ein Programm, bei dem das Ergebnis von main nicht vom Typ int ist, ist kein gültiges Programm im Sinne der C++-ISO-Norm (ISO-14882).
(aus der Wiki)

ich kenns auch nicht anders, abgesehen von Borland.

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

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
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! :(
 

Demo

Süssreinette (Aargauer Herrenapfel)
Registriert
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.
 

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
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*
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Cyrics schrieb:
oha... das ist ja komplett anders *amkopfkratz*

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

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Demo schrieb:
Tutorial nicht direkt, da ich das in der Uni groesstenteils gelernt hab. Was ich dir aber empfehlen kann, ist dieses buch.

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/
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Cyrics schrieb:
erste Hello World mal abgetippert... unter Linux hats geklappt, unter OSX nicht... egal!

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.
 

Demo

Süssreinette (Aargauer Herrenapfel)
Registriert
02.04.04
Beiträge
411
tjp schrieb:
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.
hast Du in dieses "grottenschlechte" Buch schonmal reingeschaut ? Das ist schlussendlich bei jedem persoenlich anders - mal immer ruhig mit den Pferden.

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

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)
 

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
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*
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
Demo schrieb:
hast Du in dieses "grottenschlechte" Buch schonmal reingeschaut ?
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.
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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.
 

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
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*
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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.
 

Cyrics

Neuer Berner Rosenapfel
Registriert
01.04.05
Beiträge
1.973
also welches Tutorial mir sehr gut hilft (und welchen diesen neuen ISO-Standard beinhaltet) ist hier zu erreichen. (ist der Link zu einer Druckversion ;) )
 

tjp

Altgelds Küchenapfel
Registriert
07.07.04
Beiträge
4.059
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;
}