PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : while(!eingabegemacht)



gEry
02-07-2005, 09:49
HI!

Habe wieder mal ein Problem... es gibt zwar viele Beispiele, aber bei mir will es irgendwie net -.-

Meine PRoblemlösung muss eine while() - Schleife sein welche immer läuft (endlos) und darin möchte ich Abfragen machen, ob der User eine EIngabe macht oder nicht... wenn ja dann einlesen, sonst einfach weiter machen, bis wieder abgefragt wird unsw.

Das habe ich jetzt gerade (nach langem Pröbeln):


while(1)
{
cout << "\t[!]Your Message:\n" << endl;
cout << "\t\t";

getcint = getch();

if(getcint == ERR)
{
cout << " No data!!!!!!!!!" << endl;
}
else
{
getline(cin, msg);

if((strcmp(msg.c_str(),"/exit")) == 0) { break; }

if((strcmp(msg.c_str(),"")) != 0)
{
if (send(my_socket, msg.c_str() ,BUFFER-1,0) == -1)
{
cout << "[-] Error cant send data\n" << endl;
}
else
{
cout << "\t\t[+] Successfully sendet!\n" << endl;
}
}
else
{
cout << "[-] No data to send" << endl;
}
}
}


Jedoch sieht so der Output aus:


[!]Your Message:

No data!!!!!!!!!
[!]Your Message:

No data!!!!!!!!!
[!]Your Message:


(endlosschlaufe)

ich benutze g++.

Kann mir jemand weiterhelfen, fände es wirklich super!

cheers

gEry

bischi
02-07-2005, 10:31
1) nicht namespaces std verwenden, sondern jeweils hinschreiben (erspart die etwaige Fehler...)

2) Versuch mal anstatt getcint ein

std::cin>>

Genaue Verwendung solltest du problemlos finden.

MfG Bischi

PS: cin erwartet Eingabe: Somit hast du keine Schleife mehr, die sehr schnell läuft und unnötig Ressourcen verbraucht.

PS2: Anstatt while(1) ist es übersichtlicher ein while(true) zu verwenden

PS3: sended und nicht sendet ...

gEry
02-07-2005, 10:40
1. ja, da hast du wohl recht

2. getcint ist eine von mir angelegte Variable, das hat mit std::cin>> nix zu tun... ausserdem ist bei std::cin>> das problem, dass das programm auf eine Eingabe wartet und den Rest 'blockiert', was nicht sein darf

PS: wie würdest du dann das Problem lösen?

PS2:subjektiv ;)

PS3: Danke :)

locus vivendi
02-07-2005, 16:03
Meine PRoblemlösung muss eine while() - Schleife sein welche immer läuft (endlos) und darin möchte ich Abfragen machen, ob der User eine EIngabe macht oder nicht... wenn ja dann einlesen, sonst einfach weiter machen, bis wieder abgefragt wird unsw.

[...]

Jedoch sieht so der Output aus:

Code:
[!]Your Message:

No data!!!!!!!!!
[!]Your Message:

No data!!!!!!!!!
[!]Your Message:


(endlosschlaufe)

Ich sehe da keine Diskrepanz zwischen der Beschreibung und dem was das Programm macht. Bleibt die Ausgabe denn wirklich gleich, auch wenn du eine Taste tippst? Vielleicht geht das Problem ja weg, wenn du dir noch einmal klar machst, was du eigentlich haben möchtest?

Ansonsten würde ich noch dazu raten, die Fehlerbehandlung zu vervollständigen.

Ach, noch was: Warum nimmst du eigentlich strcmp wenn ein std::string am Vergleich beteiligt ist?

gEry
02-07-2005, 17:42
Hi!

1. Ja das Programm in der endlosschlaufe nimmt gar keine eingaben an -.-

2. Was ich möchte: Eine Endlosschlaufe, welche einfach immer läuft und sobald der user eine eingabe macht soll diese eingelesen werden und danach weiterlaufen... klar?

3. Zu deiner String Frage... hmm die Stringfunktion,zum Strings vergleichen... weiter oben steht schon using namespace std; (sry kenne mich da noch nicht so gut aus... -.-)

cheers

locus vivendi
02-07-2005, 18:44
1. Ja das Programm in der endlosschlaufe nimmt gar keine eingaben an -.-
Also bei mir tuts das. Ich habe nur kleine Änderungen an deinem Programm gemacht, um ein übersetzbares und lauffähiges Programm zu bekommen.

2. Was ich möchte: Eine Endlosschlaufe, welche einfach immer läuft und sobald der user eine eingabe macht soll diese eingelesen werden und danach weiterlaufen... klar?
Soetwas würde ich nicht unbedingt für sinnvoll halten, hat bischi ja auch schon was zu geschrieben. Aber gut, sowas hast du ja bereits. Wenn bei getline probleme auftauchen solltest du möglicherweise überprüfen ob sich Ncurses und die C++-Bibliothek nicht in die Quere kommen.

3. Zu deiner String Frage... hmm die Stringfunktion,zum Strings vergleichen... weiter oben steht schon using namespace std; (sry kenne mich da noch nicht so gut aus... -.-)
Ich würd ja einfach if(msg == "lksdfjlksadjfo") machen.

gEry
03-07-2005, 00:24
1. dann zeig doch was du gemacht hast!? naja bis auf das geht alles ja...

2. Wie kann ich schauen, ob die sich in die Quere kommen? und sag doch bitte wie du es machen würdest, da du es ja anderst machen möchtest!

3. ??? und hä? wo genau? wieso?

michael.sprick
03-07-2005, 01:05
PS3: sended und nicht sendet ...
Noch nicht ganz:

send ist ein unregelmäßiges Verb. Durchkonjugiert wird es mit:

1. Form: send
2. Form: sent
3. Form: sent

Korrekt wäre z. B. : "Data has been sent successfully!"

Mehr kann ich leider auch nicht beitragen... ;)

locus vivendi
03-07-2005, 09:32
1. dann zeig doch was du gemacht hast!? naja bis auf das geht alles ja...
Ich habe jetzt einfach mal eine Datei in den Anhang getan. Das .txt am Ende ist nur wegen dem Board. Sieht alles ein bisschen hässlich aus, weil ich nur so auf die Schnelle experimentiert habe, und Curses vorher nie benutzt habe.

2. Wie kann ich schauen, ob die sich in die Quere kommen? und sag doch bitte wie du es machen würdest, da du es ja anderst machen möchtest!
Ersteres z.B. durch Ausprobieren. Das habe ich auch gemacht. Im meinem Code kannst du ja schauen, wie man den Curses-Mode kurzeitg verlassen kann. Ich gebe aber keine Garantie für Richtigkeit, wie gesagt, ich habe Curses vorher nie benutzt. Zweitens, das Problem bei deinem Ansatz *könnte* sein, dass du dir so aussuchen kannst, bzw. musst, ob du eine Schleife haben willst, die entweder schnell durchläuft, und dabei viel CPU-Zeit allein für das Iterieren selber verbraucht, und wenig Zeit für Arbeit zwischen den einzelnen Schleifendurchläufen lässt; Oder ob du eine Schleife hast die langsam läuft, und so die Abbruchbedingung selten bzw. unregelmäßig überprüft. Ein Ausweg daraus könnte z.B. sein, mehrere Threads zu benutzen. Oft ist es aber auch einfach so, das man durchaus auf die Eingabe warten kann. Das machen getline und andere Funktionen aus Standard-C und C++ ja normalerweise auch. Nun hattest du allerdings gesagt das das in deinem Fall nicht geht. Dann wirst du vermutlich einfach in dem Fall das getch "ERR" zurückliefert etwas machen, was vernünftig "getimed" ist.

3. ??? und hä? wo genau? wieso?
Wo: Da wo du in deinem Snippet strcmp verwendet hast.
Wieso: Weil es besser lesbar ist und du evtl. dann nicht <string.h> einbinden musst.

bischi
03-07-2005, 10:47
Noch nicht ganz:

send ist ein unregelmäßiges Verb. Durchkonjugiert wird es mit:

1. Form: send
2. Form: sent
3. Form: sent

Korrekt wäre z. B. : "Data has been sent successfully!"

Mehr kann ich leider auch nicht beitragen... ;)

Is aber vielleicht Mehrzahl...

MfG Bischi

Ist natürlich Blödsinn. Sent ist schon richtig, jedoch gibt es anscheinend noch viele Leute, die das falsch machen (siehe Google...)