RS232 Chat - 13. Klasse Projektvorstellungen
-
http://de.wikipedia.org/wiki/Qt_(Bibliothek)
Qt ist eine C++-Klassenbibliothek für die plattformübergreifende Programmierung grafischer Benutzeroberflächen. Neben der Entwicklung grafischer Benutzeroberflächen bietet Qt umfangreiche Funktionen zur Internationalisierung sowie Datenbankfunktionen und XML-Unterstützung an und ist für verschiedene Betriebssysteme bzw. Grafikplattformen, wie X11 (Unix-Derivate), Mac OS X, Windows und als PDA-Version erhältlich. Qt wird insbesondere in den Bibliotheken der KDE Software Compilation 4 verwendet, welche gleichzeitig das prominenteste Vorzeigebeispiel der Klassenbibliothek darstellt.
-
gamebuntu schrieb:
Verpack dein Chat in eine GUI
Schlechte Idee. Davon rate ich dir (noch) ab.
Du könntest noch Sachen wie Dateiübertragung ("SEND path/filename", "GET remote_path/filename") hinzufügen, aber irgendwann ist es ausgereizt.
Der nächste Schritt wäre selbständig ein neues Projekt anzufangen. Nicht zu gross. Damit lernt man am meisten.
Wenn du Lust auf Kritik hast, kannst du auch die 80 Zeilen Code hier posten.
-
Sehr gerne =3
#include "Serial.h" #include <conio.h> #include <iostream> #include <ctime> #include <stdio.h> int main() { const int ACK = 0x06; const int ETX = 0x03; time_t t; string text = ""; string name_me = "Me"; string name_partner = "Opposite"; Serial* SP = new Serial("COM1", 9600, 8, NOPARITY, ONESTOPBIT); if (SP->open()==true) { cout << "============================================================"<<endl<<endl; cout << "RS232 Chat v1.0 - Please enter your name >"; getline(cin,name_me); cout << endl; cout << "============================================================"<<endl<<endl; SP->write(name_me); if ( SP->dataAvailable() ) { name_partner = SP->readLine(); } while ( text != "Exit" && text != "exit" && text != "EXIT" ) { if ( SP->dataAvailable() ) { text = SP->readLine(); time(&t); cout << ctime(&t) <<name_partner<<"> " << text << endl; } else { while (_kbhit()) { time(&t); cout << ctime(&t) << name_me << " >"; getline(cin,text); if(text=="Ring" || text=="ring" || text=="RING") { SP->write("Sie haben ein Ring erhalten!\a\a\a\a\a\a\a\a\n"); cout<< name_me << " >"<<("Sie haben ein Ring gesendet!\a\a\a\a\a\a\a\a\n\n"); } else { cout<<endl; SP->write(text + "\n"); } } } } } else { cout << "Port " << SP->get_portName() << " nicht betriebsbereit"; } SP->write("Exit"); cout << endl << "Port "<< SP->get_portName() << " wird geschlossen"; SP->close(); cout << endl <<"Chat wird geschlossen"; Sleep(600); cout << "."; Sleep(600); cout << "."; Sleep(600); cout << "."; Sleep(600); return (0); }
-
1. Warum allozierst Du das Serial Objekt mit new? Warum nicht als automatisches Objekt?
2. Wenn schon mit new - wo ist das delete?[EDIT]
3. Variablen sind so kurz wie möglich vor dem Gebrauch zu definieren.
-
cout << endl <<"Chat wird geschlossen"; Sleep(600); cout << "."; Sleep(600); cout << "."; Sleep(600); cout << "."; Sleep(600);
-
Ich hab's mal kurz umgeschrieben.
#include "Serial.h" #include <conio.h> #include <iostream> #include <ctime> #include <cstdio> // stdio.h ist veraltet, unter C++ nimmt mann cstdio using namespace std; // Wenn du das noch nicht kennst, ignoriere meine Änderung // Das muss fast in Serial.h stehen und in einem Header // Namensräume einzubinden ist schlechter Stil. int main() { const int ACK = 0x06; // Konstanten zu definieren finde ich eine super Idee, const int ETX = 0x03; // aber brauchst du die überhaupt? Serial sp("COM1", 9600, 8, NOPARITY, ONESTOPBIT); // warum new? if (sp.open()) // nie ==true (oder ==false), das enttarnt dich als Anfänger { cout << "============================================================\n\n" // endl nicht nötig, \n reicht << "RS232 Chat v1.0 - Please enter your name >" << flush; string name_me; // Variablen so lokal wie möglich (kurz vor Einsatzort, siehe theta) getline(cin, name_me); cout << "\n============================================================\n\n"; sp.write(name_me); string name_partner = "Opposite"; if (sp.dataAvailable()) // Frage: müsste man nicht warten, bis der Name verfügbar ist? { name_partner = sp.readLine(); } string text; do // ich war so frei, es in eine do-while-Schleife umzuändern { if (sp.dataAvailable()) { text = sp.readLine(); time_t t; time(&t); cout << ctime(&t) << name_partner << "> " << text << endl; } else { while (_kbhit()) { time_t t; time(&t); cout << ctime(&t) << name_me << " >"; getline(cin, text); if (text == "Ring" || text == "ring" || text == "RING") { sp.write("Sie haben ein Ring erhalten!\a\a\a\a\a\a\a\a\n"); cout << name_me << " > Sie haben ein Ring gesendet!\a\a\a\a\a\a\a\a\n\n"; } else { cout << endl; sp.write(text + "\n"); } } } } while (text != "Exit" && text != "exit" && text != "EXIT"); } else { cout << "Port " << sp.get_portName() << " nicht betriebsbereit"; } sp.write("Exit"); // Frage 2: Hast du nicht schon oben "Exit" gesendet? cout << "\nPort "<< sp.get_portName() << " wird geschlossen"; sp.close(); cout << "\nChat wird geschlossen"; for (int i=0; i<3; ++i) { // Nicht unbedingt nötig, aber so ist es schöner Sleep(600); cout << "." << flush; } Sleep(600); return 0; // Klammern unnötig }Ich gebe zu, hier wirkt es gekünstelt, aber du könntest Teile des Codes in eigene Funktionen auslagern. Zum Beispiel ein compare_string_case_insensitive.
-
cosenol schrieb:
Ich hab's mal kurz umgeschrieben.
Zum Beispiel ein compare_string_case_insensitive.oder ein vergleich über ein std:upper?
-
Ring und Exit kann man auch so vergleichen:
#include <string.h> #include <string> void uppercase( std::string &str) { for( uint8_t i; i <= str.size(); i++) { str[i] = toupper(str[i]); } } uppercase(text); if( text == "EXIT") { }
-
314159265358979 schrieb:
cout << endl <<"Chat wird geschlossen"; Sleep(600); cout << "."; Sleep(600); cout << "."; Sleep(600); cout << "."; Sleep(600);
Kann mir eigentlich irgendjemand mal erklären, warum insbesondere Anfänger auf die Idee kommen, mithilfe künstlicher Sleep-Anweisungen eine rege Programmaktivität vorgaukeln zu müssen
? Zumal in 99% der Fälle sie selbst es sind, die das Programm entwickeln/testen/sehen.
-
Durchschauer schrieb:
Kann mir eigentlich irgendjemand mal erklären, warum insbesondere Anfänger auf die Idee kommen, mithilfe künstlicher Sleep-Anweisungen eine rege Programmaktivität vorgaukeln zu müssen
?Hat weniger mit dem Anfänger an sich zu tun. Soll halt "cool" aussehen/rüberkommen, da merkt man, dass mit Liebe programmiert wird

-
gamebuntu schrieb:
void uppercase( std::string &str) { for( uint8_t i; i <= str.size(); i++) { str[i] = toupper(str[i]); } }Gibt von mir ein

-
Ok man sollte es vielleicht lieber so machen :
#include <string> #include <cstring> #include <cstdint> bool equalIgnore( string str1, string str2) { if( str1.size() == str2.size()) { for( uint8_t i=0; i <= str1.size() ; i++ ) { if( toupper( str1[i]) != toupper( str2[i]) ) { return false; } } return true; }else { return false; } }