Zum Inhalt springen

Orffi

Mitglieder
  • Gesamte Inhalte

    252
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Orffi

  1. "Du musst doch auch zugeben, dass der Satz so gedeutet werden kann bzw MUSS, dass void main() in ISO C verankert ist!" Nein, das muß ich nicht und werde ich auch nie! Im Standard steht drin, daß int main() und int main (int argc, char *argv[] ) angeboten werden müssen. Nur wenn ich eine der beiden Versionen benutze kann ich sicher sein, daß mein Programm auf jedem ISO-C++-System läuft. Alles andere ist implementationsabhängig. Und wenn irgendetwas von einer bestimmten Implementation abhängig ist, kann es wohl schlecht Standard sein. Ich hoffe, daß leuchtet ein. Jan
  2. main () ist kein C++! Allerdings ist es C nach dem 1989er Standard und ist die Kurzform für int main (). Wenn man also einfach main() schreibt, hat man sich in C für int main () entschieden. Für C++ gilt dies nicht! In C++ muß int als Rückgabewert angegeben werden. C99 akzeptiert main () auch nicht mehr sondern fordert int main (). Wenn Du tatsächlich Bücher hast, die void main () schreiben, dann wirf sie weg! Im Übrigen ist mir total egal was MSDN sagt. Mich interessiert nur was ISO sagt. Nochmal: wenn ein Compiler irgendeine schreibweise akzeptiert heißt es noch lange nicht, daß es auch richtig und damit standardkonform ist. (Es gibt auch seltene Fälle wo der Compiler meckert, obwohl es standardkonform ist. Dieser Fall tritt aber bei weitem nicht so häufig auf wie erstgenannte.) "Solang das Programm läuft isses doch egal!": Bitte glaubt mir, es ist nicht egal. Wenn Du einen Pudel hast, kannst Du ihn bei der Gelegenheit entkernen. Möge der Standard mit Euch sein Jan
  3. Hier die Antwort auf die Frage von Crush: "Jetzt ist die Frage, wer setzt den Standard? Der Erfinder oder die Community?" Weder Der Erfinder, noch die Community (wer immer das sein soll...) setzt den Standard. Den Standard hat ISO (International Organization for Standardization) gesetzt. Natürlich ist das jetzt eine langweilige Antwort, aber leider die einzig richtige... Jan
  4. Was Du gerne machen möchtest ist mit ANSI-C nicht möglich. Wenn Dein Programm nicht dem ANSI-Standard entsprechen muß, dann stelle Deine Frage am besten im "C++: Compiler, IDEs, APIs" Forum. Dort müßtest Du aber noch angeben, welche Entwicklungsumgebung Du verwendest. Oder Du wartest darauf, daß einer der Moderatoren Deine Frage ins richtige Forum verschiebt. HTH Jan
  5. Beides ist richtig und entspricht dem Standard. Wobei ich zu "Standard hin oder her, wie denn jetzt richtig?" bemerken möchte: Richtig ist, was Standard ist! Oder anders ausgedrückt: Der Standard bestimmt, was richtig ist. Bei int main () werden die Kommandozeilenparameter nicht berücksichtigt. Bei int main ( int argc, char *argv[] ) kann das Programm auf die übergebenen Parameter zugreifen. Wenn ich ein Programm schreiben wollte, daß ein Dateiinhalt in eine andere Datei kopiert (copy datei1 datei2). Dann müßte ich meine main-Funktion so schreiben: int main ( int argc, char *argv[] ) (Damit ich auf die Dateinamen, die beim Programmaufruf übergeben werden, zugreifen kann) HTH Jan
  6. Das struct tm ist völlig losgelöst von Unix, Linux, Windows und allen anderen Betriebssystemen die es gibt. Hier kommt mal wieder der Standard zum tragen. Ich gehe jetzt einfach vom Ansi-C Standard aus. Der besagt, daß in <time.h> struct tm enthalten ist. Allerdings hat tm noch mehr Komponenten als Du initialisierst. Das ist ein Punkt, der nicht ganz sauber ist, denn tm_wday, tm_yday und tm_isdst sind nicht initialisiert und da können jetzt irgendwelche werden drinstehen. tm_wday: Tage seit Sonntag (0..6) tm_yday: Tage seit 1. Jan (0..365) tm_isdst: positiv, wenn Sommerzeit gilt, 0 wenn sie nicht gilt und negativ steht keine Information dazu zur Verfügung... Es ist aber schon komisch, daß das Programm korrekt läuft, wenn Du debugst. Vielleicht hilft es, wenn Du statt tSekEnde-tSekBeginn difftime ( tSekEnde, tSekBeginn ) benutzt. Leider habe ich diesmal nur Vermutungen und kann mit nichts Konkretem aufwarten. Jan
  7. Hallo zusammen! Ich würde ganz gerne ein paar Worte zur main-Funktion verlieren. Ich habe in diesem Forum schon öfter gesehen, daß "void main ()" geschrieben wurde. Das ist falsch, da in diesem Forum über ANSI-C und ISO-C++ gesprochen (oder besser geschrieben) wird. Beide Standards sagen, daß main ein int zurückliefern muß. Das kürzeste C++-Programm ist also int main () {} Dieses Programm liefert als einziges den Rückgabewert 0 an den Aufrufer (z.B. Betriebssystem) zurück. return 0; Darf in C++ in der main-Funktion weggelassen werden, es wird vom Compiler ergänzt. Die Argumentation, void main () ist nicht falsch, da der Compiler keine Fehlermeldung auswirft, zieht nicht, da noch lange nicht alles, was der Compiler ohne Fehler übersetzt richtig ist. Es mag ja sogar Systeme geben, die nur void main () anbieten, aber diese Systeme sind nicht standardkonform. Dieser Tatsache sollte man immer im Hinterkopf behalten. Übrigens ist die Annahme falsch, void main () würde funktionieren, weil void besagt, ein unbekannter Rückgabewert würde zurückgeliefert. Bei void wird kein Rückgabewert zurückgeliefert! Ein void-Funktion kann gar keinen Wert zurückliefern. Es liegt nur am Compiler, der über diesen Fehler hinwegsieht, daß void main () funktioniert. Es ist wichtig zu wissen, was Standard ist und was nicht! Also bitte, bitte nur noch int main (). Jan
  8. Orffi

    Sos

    Ok, mein posting war ein wenig überflüssig, da es prinzipiell gleich ist. Das Thema habe ich aber nicht verfehlt, da es die Frage gab, ob es einen Zufallszahlgenerator gibt. Das habe ich demonstriert. Zur main-Funktion mache ich einen neuen Thread auf, da es hier endgültig zu weit vom Thema wegführen würde. Jan
  9. Orffi

    Sos

    Ich fühle mich einfach mal von Crush angesprochen und würde es in C++ so schreiben: #include <iostream> #include <cstdlib> #include <ctime> int main() { std::time_t rndtime; std::time ( &rndtime ); std::srand ( (unsigned int)(rndtime) ); for ( int i = 0;i < 10; i++ ) std::cout << "Spiel " << ( i + 1 ) << "= " << ( ( rand() % 10 ) + 1 ) << '\n'; } Wahrscheinlich nerve ich jetzt das ganze Board aber void main (), wie Crush es geschrieben hat, ist falsch! Es ist weder Ansi C noch ISO C++. void main () gibt es nicht! Sonst sieht der Quelltext relativ gleich aus. Allerdings habe ich es vermieden, die Header mit .h einzubinden. Die Funktionen blieben also alle im std Namensraum. Wenn man die Programme sehr schnell hintereinander startet, dann kann es vorkommen, daß man immer noch gleiche Würfelergebnisse bekommt. Man kann beliebig viel Aufwand betreiben um diesen Mißstand zu beheben oder sich vom Pfad der Kompatibilität und Portierbarkeit abwenden und systemspezifische Funktionen/Eigenheiten nutzen. Da der Computer deterministisch ist, muß man sich ein wenig anstrengen zufälliges Verhalten zu erzeugen. HTH Jan (Nach vielen Anstrengunge habe ich jetzt auch eine vernünftige Einrückung.)
  10. Orffi

    Sos

    int rand (void) in <stdlib.h> liefert eine (pseudo) Zufallszahl. Man kann auch mit void srand ( unsigned int ) einen neuen Ausgangswert für eine Zufallsreihe festlegen. Am besten gibt man in srand eine Zahl an, die man aus einer Zeitfunktion erhält. So wird ein wenig mehr Zufall ins Spiel gebracht. HTH Jan
  11. Orffi

    Sos

    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
  12. 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
  13. 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
  14. Es gibt in der Hilfe ein Beispiel, wie man mit EchoClient arbeitet. (Ich weiß, da fehlt die Exceptionbehandlung komplett.) Sonst kannst Du Dich ja mal bei TApplication OnException (auch in der Hilfe) umsehen, ob Du damit glücklicher wirst. HTH Jan
  15. 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
  16. 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
  17. Orffi

    cin.getline

    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
  18. 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
  19. Orffi

    Komponente sinnlos?

    Leere Funktionen können durchaus komplett leer sein. void foo (void) { } ist also richtig und sollten keinen Compiler vor ein Problem stellen. Jan
  20. Orffi

    timer function in c++

    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
  21. 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
  22. Orffi

    ifstream - oftream

    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
  23. Orffi

    cin.getline

    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...