Zum Inhalt springen

Orffi

Mitglieder
  • Gesamte Inhalte

    252
  • Benutzer seit

  • Letzter Besuch

Beiträge von Orffi

  1. Was ist jetzt Dein Problem?

    So ist es sehr schwer, Dir zu helfen. Wenn Du schon Vorarbeit geleistet hast und weißt wie die Struktur des Programms aussieht dann kannst Du ja anfangen zu programmieren und dann spezifische Fragen stellen.

    Jan

  2. Ich bin auch gerne kleinlich, deswegen vorweg zwei Bemerkungen:

    1. Den ISO-Standard (ISO/IEC 14882) gibt es erst seit 1998. Vorher gab es natürlich C++, aber noch keinen Standard. Es gab (und gibt) auch sogenannte Drafts, diese wurden (werden) vielleicht irgendwann Standard (vielleicht aber auch nicht). Wenn man aber über Standard C++ reden möchte, dann muß man zu heutiger Zeit von ISO/IEC 14882 sprechen. Was vor dieser Zeit war, ist unwichtig! (Also auch das, was classic iostream genannt wird.)

    2. Natürlich kann nur der Hersteller standardkonformes garantieren. Machen alle auch gerne, halten sich aber nie 100%ig daran. Weder Bjarne Stroustrup noch ANSI noch ISO kann für irgendetwas garantieren. ISO sagt ja auch nur, wenn man ein standardkonformes System hat, dann sind bestimmte Dinge garantiert. Wenn das System nicht konform ist, dann garantiert Iso natürlich nichts. Es ist ja sogar so, daß der Standard von "undefined behavior" in bestimmten Kontexten spricht. Das heißt, der Compilerhersteller kann selber entscheiden wie er diese Situation bearbeitet. (Dies sollte man vermeiden, denn damit ist die Portierbarkeit nicht mehr garantiert.)

    Das erstmal vorweg, jetzt zum eigentlichen Problem:

    Vor der Standardisierung gab es in der Tat die Möglichkeit (zum Beispiel) <iostream.h> einzubinden. Viele (wahrscheinlich sogar sehr viele) Compilerhersteller bieten diese Art Header einzubinden immer noch aus Kompatibilitätsgründen an. Der Standard spricht aber von <iostream> (oder auch von <map>, <fstream>,...). Es ist nämlich der Implementation überlassen, ob es tatsächlich eine Datei iostream.h gibt. Der Compilerhersteller hat die freie Wahl. Also ISO-C++ wäre es #inlcude <iostream> zu schreiben. Das #include <iostream.h> wird nur noch zur Kompatibilität angeboten.

    Jetzt zur Geschichte mit den classic iostreams. Ja, die gab es und zwar vor der Standardisierung. Diese arbeiteten nicht mit Templates. Im Standard wurde dann die "neuen" iostreams, die mit Templates arbeiten, beschlossen. Daß sich der Name von <iostream.h> zu <iostream> geändert hat, hat mit dem oben Erwähnten zu tun und nicht damit, daß man mit <iostream.h> auf die classic iostreams zugreifen könnte.

    HTH

    Jan

  3. So wie es maxim_42 schreibt stimmt es nicht und kann es gar nicht stimmen, denn:

    Der Standard hat festgelegt, was in iostream "drin" zu sein hat und wie es sich verhält. Wie die einzelnen Compilerhersteller dieses Verhalten erreichen ist denen überlassen und darüber sagt der Standard nichts. Aber <iostream> ob mit oder ohne .h muß sich an den Standard halten, was das Verhalten betrifft. Noch ein Beispiel:

    #include<iostream.h>

    int main ()

    {

    cout << "Hallo Welt!\n";

    }

    Dieses Programm funktioniert wunderbar. Wirft auch keine Warnung aus, weil der Standard besagt, daß in main return 0 weggelassen werden kann.

    Folgendes Beispiel geht aber nicht:

    #include<iostream>

    int main ()

    {

    cout << "Hallo Welt!\n";

    }

    Hier ist cout nämlich nicht bekannt, also muß man std::cout << ... schreiben, oder using namespace std; am besten in die main-Funktion.

    HTH

    Jan

  4. Auf die Gefahr hin, mich unbeliebt zu machen:

    Wenn man C lernen will/muß, dann sollte man ein C Buch nehmen. Es gibt kleine aber feine Unterschiede zwischen C und C++.

    Ich persönlich würde kein Buch von Data Becker nehmen. (Liegt aber wohl eher daran, daß ich von Data Becker prinzipiell nichts halte.)

    Das beste Buch über C ist das von Kerninghan und Ritchie, allerdings ist es nicht einfach. Ansonsten hier 2 Links

    http://www.rz.uni-osnabrueck.de/Dokumentation/RZ_Skripte/Programmieren_In_C/pdf/cprog.pdf

    http://info.baeumle.com/ansic.html

    Dort kann man auch eine Pdf-Datei herunterladen.

    Wenn es nicht gefällt, hat es zumindestens nichts gekostet...

    HTH

    Jan

  5. In der Tat benötigt der try-Block noch einen catch-Block:

    try

    {

    //tue etwas, was eine Exception wirft..

    }

    Jetzt müßtest Du noch wissen, was für eine Exception geworfen wird. Diese kannst Du dann im catch-Block abfangen:

    catch ( ExceptionTy &e )

    {

    //mache irgendetwas...

    }

    Man kann auch alle Exception abfangen ohne Unterscheidung:

    catch (...)

    {

    }

    Ich weiß jetzt nicht, welche Internet-Komponenten im BCB 5 drin sind Netmaster oder Indy. Am besten schaust Du in der Hilfe nach um zu erfahren, welche Exception geworfen werden können.

    HTH

    Jan

  6. Es kommt darauf an, was man als gut empfindet. Das entscheidene hier ist: "zur Übersetzungszeit". Hier ist überhaupt nichts Dynamisches. Dynamisch bedeutet, daß irgendetwas zur Laufzeit passiert. Im allgemeinen hat man unter C++ Strings die man benutzen sollte, da hier die ganze Speicherverwaltung von string geregelt wird.

    Worauf ich hinaus wollte war: char *satz; ist definitiv kein Speicherplatz für einen String. Bei "char *satz;" reserviert der Compiler Speicherplatz für einen Zeiger, der auf char zeigt. Mehr nicht und das ist meilenweit davon entfernt ein string zu sein.

    HTH

    Jan

  7. Ich hätte da auch eine kleine Frage am Rande:

    Warum beutzt Du nicht die STL? Wenn ich es richtig verstehe, dann soll es eine Verkette Liste werden. Die STL bietet eine Verkette Liste schon an, so daß man das Rad nicht neu erfinden muß.

    Der Container findet sich im <list> header.

    HTH

    Jan

  8. Das Problem bei dieser Lösung ist, daß sie keine Ansi/Iso Lösung ist. C++ kennt weder SetTimer (ist eine Funktion aus der Windows-Api) noch kennt C++ Events, wie sie hier benutzt werden.

    Man kann sich in C++ leider nur mit busy waiting helfen. Man muß eine Schleife schreiben, in der mit clock_t zeit = clock(); Die Zeiten gemessen/geprüft werden. Ist nicht die schönste Lösung, aber die einzige, in C++ möglich ist. Die andere Lösung, gehört leider nicht in diese "Abteilung"...

    Jan

  9. Die Version #include <iostream.h>

    gibt es, weil C++ Compiler ja auch C Programme kompilieren soll. Deswegen wird hier auch gleich der Namespace "gesetzt". Nun gab es dann ein Problem, daß man sich nicht einigen konnte, wie die Erweiterungen bei C++ heißen sollten. Eine Möglichkeit wäre ja .hpp gewesen. Man hat dann gesagt, man läßt die Endung weg. Das geht nur in C++ und deswegen, wird hier der Namespace nicht gesetzt, weil es kein C Programm sein kann. Außerdem ist es nicht gut mit dem using namespace std; "herumzuschmeißen", denn Ziel von Namespace ist es ja, daß man verschiedene Namensräume hat. Wenn man sie nun in seinem Programm via using namespace... wieder alle zusammen wirft, hätte sich das Standardkomitee die ganze Arbeit sparen können. Deswegen sollte man maximal using namespace std; in eine Funktion 'reinschreiben oder auf std:: zurückgreifen.

    Jan

  10. Auch wenn das Problem schon gelöst ist:

    wenn man ifstream benutzt, dann braucht man nicht mehr den Modus, wie man die Datei öffnen will angeben.

    Es reicht also ifstream file (filename);

    Anders liegt der Fall, wenn man fstream benutzt, dort muß man ein paar Informationen mit angeben.

    Jan

  11. Hallo zusammen!

    Ich wollte schnell ein paar allgemeine Bemerkungen loswerden:

    void main (void) entspricht nicht dem ANSI/ISO C++-Standard. Es wird von vielen Compilern akzeptiert, ist aber nicht richtig und sollte nie benutzt werden, da so kein Rückgabewert ans Betriebssystem geliefert wird.

    cout << endl; ist um den Puffer zu leeren aus mehreren Gründen nicht nötig:

    1) cout << endl; ist ein zusammengesetztes cout << '\n'; cout.flush(); Wenn es also nur darum geht den Puffer zu leeren, dann reicht ein cout.flush().

    2) Auch ein cout.flush() ist nicht nötig weil man cout und cin mit tie() aneinander binden kann, so daß zum Beispiel die Ausgabe auf dem Bildschirm erscheint bevor die Eingabe erwartet wird.

    3) Auch tie() ist nicht nötig, da der Standard besagt, daß die beiden Streams (cin, cout) syncronisiert sind, also die Ausgabe vor der Eingabe ausgeführt wird.

    using namespace std sollte man besser in die einzelnen Funktionen hereinziehen, oder wenn es kleine Funktionen sind, die nicht soviele cin, cout, etc aus dem Standard Namespace haben mit std:: arbeiten. So wird verhindert, daß man Namensüberschneidungen hat. Dies kann unter umständen zu sehr komischen Fehlermeldungen führen.

    Und ganz wichtig: char *string; ist bei weitem kein String!!!! Es ist ein Zeiger auf einen Datentyp char. char *satz ="Hallo Welt!"; funktioniert nur, weil der Compiler zur Übersetzungszeit sieht, Hallo Welt hat soundso viel Buchstaben, also brauche ich soundsoviel Speicher. ich kann jetzt sicherlich nicht satz erweitern. Wenn man char *satz; hat, dann muß man, wenn man sich in C befindet mit malloc speicher reservieren, oder in C++ new benutzen. malloc funktioniert zwar auch in C++ doch sollte man hier wirklich auf new zurückgreifen.

    Jan

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...