RS232 Chat - 13. Klasse Projektvorstellungen
-
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; } }