Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Es ist durchaus erlaubt, .h-Dateien zu includen. Jedoch gibt es in der Standardlibrary keine Dateien mit dieser Endung. Wenn du also irgendwo ein
Code:
#include <*.h>
stehen hast, sollte dir klar sein, dass du gerade nicht die Standard-Library verwendest.
Dies ist z.B. bei conio.h und windows.h der Fall. (Ich musste gerade erstmal nachgucken, wofür conio überhaupt steht^^). Das sind beides Dateien aus der Microsoft-Welt und damit eher nicht portabel. Die Frage ist doch eigentlich, wozu du die beiden Dateien einbindest. Also welche Funktionen kennt der Compiler nicht mehr, wenn du die #include-Zeilen wegnimmst? Für diese Funktionen solltest du dir dann überlegen, ob du sie nicht mit was anderem ersetzen willst.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Wie lese ich Pfeiltasten mit getch() richtig aus ?
Bei ReadKey bei Pascal/Lazarus kommt immer zuerst eine #0 anschliessend der Code (#72,#75,#77,#80). Bei getch() kommt nur bei den Pfeiltasten auf dem Ziffernblock eine #0, bei den Cursor-Tasten kommt #32. Kommischerweise wen ich nach getch() google, da schreiben sie von #224 und ich bekomme eine #32 bei den Cursor-Tasten ?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich weiß garnicht, auf welcher ebene das standardisiert ist. Aber es gibt nicht ohne grund große Libs für sowas (curses z.B.). Terminals sind echt frickelig, weil es historisch betrachtet zigtausende davon gab.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Außer zu ersten Übungszwecken oder sehr "spezieller" "abstrakter" Software(Compiler, OS, etc.) gibt es eigentlich keinen Grund, sich damit auseinander zu setzen. Ich glaube nicht das Mathias gerade solche Anwendungen schreibt. Und zu Übungszwecken ist die Taste eigentlich egal.
Sehr populäre Einsteigerlibs für richtige gragische Umgebungen außerhalb der langweiligen Kommandozeile sind moderner SFML und etwas älter im C-Stil SDL. Ich glaube zwar das es für dich noch etwas zu früh ist, aber wenn du wirklich mal etwas machen willst, fange damit an.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
MSDN ist dein Freund bei der google suche
Zitat:
Die _getch und _getwch-Funktionen lesen ein einzelnes Zeichen von der Konsole, ohne das Zeichen auszugeben. Keine dieser Funktionen kann verwendet werden, um STRG+C zu lesen. Um eine Funktionstaste oder eine Pfeiltaste zu lesen, muss jede Funktion zweimal aufgerufen werden; der erste Aufruf gibt 0 oder 0xE0 zurück und der zweite Aufruf den tatsächlichen Tastencode. Diese Funktionen sperren den aufrufenden Thread und sind daher threadsicher. Informationen zu nicht sperrenden Versionen finden Sie unter _getch_nolock, _getwch_nolock.
Wenn du deine Ausgabe mit printf, statt der kotigen cout Operator Overloading mistdreck (wer hat sich diesen scheiß eigentlich ausgedacht?), machst, dann siehst du es.
da schreiben sie von #224 und ich bekomme eine #32 bei den Cursor-Tasten ?
Ich habe den Fehler gefunden, ich habe mein Zeichen jetzt mit unsigned char anstelle char deklariert, jetzt kommt #224.
Zitat:
Keine dieser Funktionen kann verwendet werden, um STRG+C zu lesen.
Bei mir kommt mit getch(); und _getch() eine #3;
Was bedeutet der Unterstrich vor getch() ?
Zitat:
Wenn du deine Ausgabe mit printf, statt der kotigen cout Operator Overloading mistdreck (wer hat sich diesen scheiß eigentlich ausgedacht?), machst, dann siehst du es.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Der Unterstrich bedeutet das der Name reserviert ist und vom Programmierer nicht benutzt werden darf. Du darfst also eine Funktion getch selbst bauen aber niemals eine Funktion _getch, denn der Compiler oder die Standardbibliothek könnten diesen Namen verwenden. getch wird in der Regel nur ein Macro sein das _getch aufruft.
Die Printf-Familie ist eine Reihe von Funktionen die du, mit kleineren Abwandlungen, in so ziemlich jeder Sprache findest. Diese Funktionen beschäftigen sich ausschließlich damit, wie man Sachen als Text darstellt. Cout hingegen ist das Stream-Objekt für den Standard Output-Stream. Als solches beschäftigt es sich vorrangig damit wie man einzelne Buchstaben ausgibt.
So gesehen ist Cout also etwas flexibler als Printf, dafür aber auch komplizierter. Ein gutes Beispiel dafür sind Formatierungen:
Code:
printf("%.4i\n%i\n", 12,3); // die 12 wird Formatiert ausgegeben, die 3 nicht
std::cout.width(4); //Formatierung setzen
std::cout << 12 << '\n'; //12 Ausgeben
std::cout.width(0); //Formatierung zurücksetzen
std::cout << 3 << '\n'; //3 Ausgeben
In C++ kommt noch hinzu das die Stream-Objekte komplexe Wrapper-Funktionen durch Operatoren verstecken. Das ist dann natürlich nicht mehr lustig wenn man hier noch fix etwas berechnen will, denn es gibt sehr viele Operatoren die erst nach den Shift-Operatoren ( << und >>) verarbeitet werden. Du brauchst also eigentlich immer noch Klammern oder Hilfsvariablen...
Warscheinlich bin ich von Free-Pascal verwöhnt, wen ich in einer Unit etwas ändere, so merkt der Kompiler dies. Der gcc merkt dies nicht. Vieleicht liegt dies auch an Code::Blocks.
Auch die Trennung zwischen den cpp und hpp Dateien finde ich sehr unübersichtlich. Die Lösung von Pascal mit den Units finde ich viel sauberer.
Natürlich habe ich auch positive bei C++11 gesehen, der Code kann kann einiges mehr als der von Pascal. Z.B.:
Der Compiler kann nichts dafür, wenn er Änderungen nicht bemerkt. Das muss ein Fehler im Buildsystem(zb. diesen "Make"-Kram) sein, das bei Code::Blocks vielleicht auch irgendwie mit der IDE verknüpft ist. Ich hatte dieses Problem bisher auch mit Code::Blocks noch nicht, obwohl ich sonst Visual Studio verwende, das vom verwöhnen bei der Benutzung auf der Windows-Platform meiner Meinung nach ganz vorne liegt. Insbesondere wenn du dich eh auf Windows beschränken willst und scheinbar WinAPI nutzt, würde ich auch Visual Studio verwenden.
Die Trennung von Headern und Sources ist in der Tat nicht gerade das Gelbe vom Ei. Neben das es einfach unpraktisch ist führt es auch zu weiteren Problemen, zb. verlängert es die Compilezeiten erheblich. Es gibt schon seit längerer Zeit die Idee so genannte "Module" in C++ zu integrieren. Leider hat das der Standard bisscher nicht geschafft umzusetzen. Frühestens in C++17 wäre mit so einer Neuerung zu rechnen...
Das von dir erähnte positive gibt es übrigens auch schon in C und hat nichts mit C++11 zu tun.
Insbesondere wenn du dich eh auf Windows beschränken willst und scheinbar WinAPI nutzt, würde ich auch Visual Studio verwenden.
Interessant währe es schon, wen man Plattformübergreifend programmieren kann. Aber da es keine uses Crt gibt, habe ich es erst mal mit der Win-API probiert.
Zu Code::Blocks, ich würde gerne Eclipse verenden, nur verwendet Eclipse für die Ausgabe nur die interne Konale, anstelle der Windows cmd.
Und wieder sollte "SetConsoleCursorPosition" schuld sein, oder, weil sonst sollte die Eclipse Konsole genauso gut/besser sein als die von Windows. Wofür brauchst du die Funktion überhaupt konkret? Sonst kann ich nur nochmal sagen, das man auf solche Spielereien in 99,9% der Fälle verzichten sollte. Die Konsole dafür einfach nicht ausgelegt. Vielleicht war es in Pascal üblich die Funktion für irgendetwas zu nutzen, was sich mir verschließt. Ich weiß nur, dass man sie in C++ nicht verwendet, sonst wäre sie ja auch standardisiert, wie du dir sicher selbst denken kannst.
Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.