+- +-

Benutzer

Welcome, Guest.
Please login or register.
 
 
 
Forgot your password?

Autor Thema: ZZ++  (Gelesen 7166 mal)

Neranja

  • likes pushing buttons
  • Trident Vollmitglied
  • Boardmonster
  • Beiträge: 3.998
  • Thread Necromancer
    • Profil anzeigen
Re: ZZ++
« Antwort #15 am: 20. Juli 2007, 10:08:29 »
Zu den Macros habe ich übrigens auch noch was gefunden, nämlich ein Zitat von Bjarne Stroustrup, dem Erfinder von C++ und zwar in der Einführung in ISO-C++ von Holger Jakobs (freies E-Book) auf Seite 6.[...]

Nicht gleich das Kind mit dem Badewasser auskippen, bitte. Wir reden hier von "#define" Präprozessor-Anweisungen, die eigentlich ja nichts weiter machen als einen Text im Quelltext durch anderen Text - entweder längeren und eklig zu tippenderen oder Konstanten, die man überall braucht - zu ersetzen. Man kann natürlich auch viel durchgeknalltes und schweinisches damit machen (besonders weil die #define's auch Argumente haben können), aber um einfache Konstanten zu definieren reicht es allemal. Schau Dir z.B. mal dein <stdio.h> an, da findest Du so Dinge wie:

/* The possibilities for the third argument to `fseek'.
   These values should not be changed.  */
#define SEEK_SET        0       /* Seek from beginning of file.  */
#define SEEK_CUR        1       /* Seek from current position.  */
#define SEEK_END        2       /* Seek from end of file.  */

Man könnte natürlich die Konstanten irgendwo ablegen, vor allem weil man die C-library ja meist eh mitlinkt, und die könnte ja die Konstanten verwalten - nur hat das zwei Haken: Zum einen könnte irgendein amok laufendes Programm die Konstanten in diesem Speicherbereich ändern, und zum anderen sind die Konstanten dann nicht inline im Code zu finden, und der Prozessor muss teilweise lange 32bit bzw. 64bit-Adressen referenzieren, was länger dauert als lokale, relative Referenzen oder direkte Vergleichsparameter im Codestrom aufzulösen.

Man kann zwar in C++ Werte definieren und die mit "const" deklarieren, aber im Regelfall wird das einfach nicht gemacht weil man auch in C++ seinen Heap und Stack trashen kann. Und dann erlaubt C++ natürlich auch so witzige Dinge wie

int y = 42;
const int* pointerToY = &y;
int* imfsckingupY = &y;
*imfsckingupY = 23;
Außerdem lässt mich mein Schaf nicht mehr ran

Zippozipp

  • Mein Pupu schmeckt nach Schoko
  • Trident Vollmitglied
  • Textkönig
  • Beiträge: 1.722
  • Paria und Königsmörder
    • Profil anzeigen
Re: ZZ++
« Antwort #16 am: 20. Juli 2007, 12:30:35 »
Man kann zwar in C++ Werte definieren und die mit "const" deklarieren, aber im Regelfall wird das einfach nicht gemacht weil man auch in C++ seinen Heap und Stack trashen kann. Und dann erlaubt C++ natürlich auch so witzige Dinge wie
Bahnhof!

Neranja

  • likes pushing buttons
  • Trident Vollmitglied
  • Boardmonster
  • Beiträge: 3.998
  • Thread Necromancer
    • Profil anzeigen
Re: ZZ++
« Antwort #17 am: 20. Juli 2007, 13:08:34 »
Bahnhof!

Der Stack ist der Teil vom Speicher, auf den ein Programm die Argumente für aufzurufende Funktionen schiebt. Mehr unter http://de.wikipedia.org/wiki/Stapelspeicher

Der Heap wiederum ist der Speicherbereich von dem dynamischer Speicher für beliebiges, zur Laufzeit erst generiertes Zeug angelegt wird. Im klassischen C also das was malloc() macht und in C++ alles was über "new" angelegt wird: http://de.wikipedia.org/wiki/Dynamischer_Speicher

Im klassischen C-Speichermodell liegen Stack und Heap an gegenüberliegenden Enden und wachsen auch gegeneinander. Wächst das eine in den Bereich des anderen macht es Ka-Bumm und dein Programm stürzt ab.

Wir schweifen allerdings leicht vom Thema ab, und vertrau mir deswegen einfach wenn ich sage:
1. Stroustrup mag im akademisch/theoretischen Sinn richtig liegen das Makros nicht "schön" sind und die Sprache sich für solche Konstrukte nicht von einem Präprozessors abhängig machen sollte.
2. Man darf nicht bedingungslos akademisch/theoretische Anforderungen an eine Sprache wie C++ richten, vor allem nicht wenn diese Sprache auf dem Fundement C (und die wiederum auf B und BCPL) ruht, die ja gerade nicht als "schöne Lehrsprache" entwickelt wurde sondern aus der Praxis für die Praxis - mit allen Hacks und Kludges die dazugehören, und:
3. Schon drei mal nicht wenn man seine Spracherweiterung zunächst selbst als eine Art glorifizierten Präprozessor entwickelt.
4. Ausserdem ist Objective C ist das "schönere" objektorientierte C und es gibt haufenweise bessere Sprachen um "richtig" Programmieren zu lernen und die auch das Auge des theoretischen Informatikers erfreuen.
Außerdem lässt mich mein Schaf nicht mehr ran

Zippozipp

  • Mein Pupu schmeckt nach Schoko
  • Trident Vollmitglied
  • Textkönig
  • Beiträge: 1.722
  • Paria und Königsmörder
    • Profil anzeigen
Re: ZZ++
« Antwort #18 am: 23. Juli 2007, 19:23:57 »
Sodale, dann werfe ich mal wieder was zum Fraße vor. Es ist ein einfaches Programm, dass Celsius in Fahrenheit oder Fahrenheit in Celsius umrechnet. Wie man die Nachkommastellen begrenzt weiß ich noch nicht und zu printf komme ich erst in 2 Kapiteln, seht mir also die Formatierungskapriolen nach  8)
Üben wollte ich vor allem mit dem Eingabepuffer und halt auch endlich mal eine Schleife.

Die Variable cels_oder_fahr als Bool ging übrigens nicht, falls mir jemand sagen kann wieso, wäre ich wirklich dankbar. Ich meine der Compiler hatte nix zu meckern aber das Programm funktionierte nicht wie es sollte, es hat immer den ganzen else-Bereich ignoriert. Dabei mache ich den Eingabepuffer eigentlich extra vorher leer...es ist mir echt ein Rätsel.

Itchy

  • Administrator
  • Boardmonster
  • Beiträge: 5.862
    • Profil anzeigen
Re: ZZ++
« Antwort #19 am: 23. Juli 2007, 20:46:06 »
Das return 0 finde ich immer noch hässlich, aber gut, was will man machen...

Bzgl. Deinem bool Problem - ich nehme an, Du hast das genauso wie im Code gemacht, also mit

cin >> cels_oder_fahr;
Wobei cels_oder_fahr als bool deklariert ist.

Nun muss man wissen, dass der bool Datentyp in C++ nichts anderes ist als eine Zahl, wobei der Wert 0 als FALSE interpretiert wird und ein Wert ungleich 0 (also negative oder positive Zahl) als TRUE.

Eine Eingabe von 1 oder 2 ist also immer TRUE.

Itchy

  • Administrator
  • Boardmonster
  • Beiträge: 5.862
    • Profil anzeigen
Re: ZZ++
« Antwort #20 am: 23. Juli 2007, 21:00:00 »
Weiter:

in Zeile 27 sollte das nicht 9,0 sondern 9.0 heißen. (Hint: g++ -Wall)

Die Anzahl der Stellen kannst Du wie folgt beschränken:

#include <iomanip>


        cout << eingabewert << " Grad Celsius entsprechen " << setiosflags(ios::fixed) << setprecision(2) << ergebnis_czf <<
          " Grad Fahrenheit" << endl;

Zippozipp

  • Mein Pupu schmeckt nach Schoko
  • Trident Vollmitglied
  • Textkönig
  • Beiträge: 1.722
  • Paria und Königsmörder
    • Profil anzeigen
Re: ZZ++
« Antwort #21 am: 23. Juli 2007, 21:02:00 »
Das return 0 finde ich immer noch hässlich, aber gut, was will man machen...

Bzgl. Deinem bool Problem - ich nehme an, Du hast das genauso wie im Code gemacht, also mit

cin >> cels_oder_fahr;
Wobei cels_oder_fahr als bool deklariert ist.

Nun muss man wissen, dass der bool Datentyp in C++ nichts anderes ist als eine Zahl, wobei der Wert 0 als FALSE interpretiert wird und ein Wert ungleich 0 (also negative oder positive Zahl) als TRUE.

Eine Eingabe von 1 oder 2 ist also immer TRUE.
Ah, stimmt, ich bin irgendwie davon ausgegangen wenn die Variable was anderes als 1 oder 0 bekommt bleibt sie bei ihrem alten Wert, würde also im Endeffekt nur 0 oder 1 aufnehmen. Das ist selbstverständlich  quark  :shutup: Danke Dir.

Weiter:

in Zeile 27 sollte das nicht 9,0 sondern 9.0 heißen. (Hint: g++ -Wall)

Die Anzahl der Stellen kannst Du wie folgt beschränken:

#include <iomanip>


        cout << eingabewert << " Grad Celsius entsprechen " << setiosflags(ios::fixed) << setprecision(2) << ergebnis_czf <<
          " Grad Fahrenheit" << endl;
Das mit dem Komma ist natürlich richtig. Der Rest ist mir schon wieder zu viel Bahnhof  :biggrin:

Im Anhang ist die gefixte Version (Komma und so).
« Letzte Änderung: 23. Juli 2007, 21:07:29 von Zippozipp »

Zippozipp

  • Mein Pupu schmeckt nach Schoko
  • Trident Vollmitglied
  • Textkönig
  • Beiträge: 1.722
  • Paria und Königsmörder
    • Profil anzeigen
Re: ZZ++
« Antwort #22 am: 25. Juli 2007, 17:26:04 »
MFC kommt nocht. Erst das easy Buch an dem ich grade bin, dann das Folgebuch, dass der easy-Autor empfiehlt (liegt hier schon rum). Danach dann MFC (Buch liegt hier auch schon) und danach...mal schauen.
Danke für den Link, scheint mir ziemlich umfangreich zu sein.

 

Benutzer Online

246 Gäste, 0 Mitglieder
Powered by EzPortal