Problem mit Chat-Programm
-
Hier ist soweit der Code:
#include <ncurses.h> int main(void) { int i, j, k, l, m; // i = Position des Zeichens im Satz; j= benötigt, um Fenster zu löschen // k und l = benötigt, um einzelne Wörter zu bilden int breite, hoehe; // breite und höhe des Terminal-Fensters char *ch, **woerter; // StringArray des eingegebenen Satzes WINDOW *fenster1, *fenster2; // Fenster1 zum chatten, Fenster2 zum eingeben des Satzes if (initscr()==NULL){ // fprintf(stderr, "curses init fail!\n"); exit(1); } hoehe=LINES; //eigentlich abhängig von Terminalgröße!! breite=COLS; fenster1=newwin(hoehe-3, breite, 0, 0); //erstes Fenster füllt beinahe gesamte Fenster-Größe aus fenster2=newwin(3, breite, hoehe-3, 0); //2. Fenster letzte 3 Zeilen (zum Eingeben des Satzes) clear(); refresh(); if(start_color() == OK) { //Farben verfügbar? init_pair(1, COLOR_WHITE, COLOR_BLACK); // Farbkombination für 1. Fenster init_pair(2, COLOR_WHITE, COLOR_RED); // Farbkombination für 2. Fenster init_pair(3, COLOR_GREEN, COLOR_BLACK); // Farbkombi für Nachricht (Fenster1) init_pair(4, COLOR_RED, COLOR_BLACK); // Farbkompi für Antwort (Fenster1) wattrset(fenster1, COLOR_PAIR(1)); // Farben festlegen für Fenster1 wattrset(fenster2, COLOR_PAIR(2)); // Farben festlegen für Fenster1 } else { //wenn keine Farben verfügbar, dann inverse Darstellung wattrset(fenster1, A_REVERSE); wattrset(fenster2, A_REVERSE); } cbreak(); //Zeilenweise Pufferung ausschalten noecho(); //Echo ausschalten (kontrollierte Ausgabe) scrollok(fenster1, TRUE); //Scrollen für Fenster1 wichtig! // fenster1 gibt nur aus (keine Eingabe), Eingabe in Fenster2 kontrolliert -> "keypad" nicht nötig // scrollok für fenster2 nicht nötig, da eindeutige Anweisungen für Enter wclear(fenster2); //löschen des Fenster2 (auf die Hintergrundfarbe) refresh(); do{ ch=(char *)malloc(120); //Speicherplatz freimachen woerter = (char **)malloc(120); for (i=0; i<20; i++) woerter[i]=(char *)malloc(40); i=0; //Position im Wort muss immer wieder auf Anfang gesetzt werden for (j=0; j<breite; j++) //Inhalt des Fensters2 löschen (statt wcls) mvwaddch(fenster2, 1, j, ' '); wrefresh(fenster2); box(fenster2, ACS_VLINE, ACS_HLINE); //Box um Fenster2 malen wmove(fenster2, 1, 1); //Cursor an 1. Position in Fenster2 setzen wrefresh(fenster2); refresh; //neues Wort: do{ if (i<0) i=0; //Wenn wegen Löschen i kleiner 0, i auf Null setzen ch[i]=wgetch(stdscr); //Zeichen einlesen if(ch[i] != '\n') { //wenn Zeichen nicht Enter if (iscntrl((int)ch[i])) //Wenn Zeichen Steuerzeichen (backslash oder tab) {ch[i]='\0'; //Zeichen im Wort löschen mvwprintw(fenster2, 1, i, " ");//Ausgabe: letztes Zeichen löschen wrefresh(fenster2); i=i-2; //in Wort 2 Zeichen zurückgehen (wird später um 1 erhöht) } mvwprintw(fenster2, 1, i+1, "%c", ch[i]);//Zeichen an i+1. Stelle ausgeben wrefresh(fenster2); refresh;} if(i > breite-3) { //Wenn Ende des Feldes überschritten wurde ch[i]='\n'; //automatisch Eingabe beenden //mögliche Ausgabe in Fenster1: //wprintw(fenster1, "Ihre Nachricht ist zu lang\n"); //wrefresh(fenster1); break;} i++; //Zum nächsten Buchstaben des Wortes weitergehen } while(ch[i-1] != '\n'); //Bis Wort durch drücken der Enter-Taste beendet wird. wattrset(fenster1, COLOR_PAIR(3)); //Nachricht-Farbkombination wprintw(fenster1, " Ihre Nachricht: "); wattrset(fenster1, COLOR_PAIR(1)); //normal-Farbkombination wprintw(fenster1, "%s", ch); //eingegebenen Satz ausgeben wrefresh(fenster1); refresh(); l=0; //l steht für die Buchstabenstelle im Wort m=0; //m steht für die Stelle des Wortes im Satz for (k=0; k<i; k++){ //solange wie das Ende des eingegebenen Satzes nicht erreicht wurde: if ((ch[k]==' ') || (ch[k]=='\n') || (ch[k]=='.') || (ch[k]=='!') || (ch[k]=='?') || (ch[k]==',')){ //Wenn das Zeichen ein Satzzeichen oder Leerzeichen ist, dann if (woerter[m][0] != '\0') //wenn das Wort m nicht leer ist (was es durch zwei Satz- oder Leerzeichen //hintereinander sein könnte, m++; //dann gehe zum nächsten Wort l=0; //zum ersten Buchstaben des Wortes } else { woerter[m][l]=ch[k]; //ansonsten schreibe den Buchstaben in das aktuelle Wort und Buchstabe l++; //und gehe zum nächsten Buchstaben des Wortes } } //ANTWORT: wattrset(fenster1, COLOR_PAIR(4)); //Antwort-Farbkombination wprintw(fenster1, " Antwort: "); wattrset(fenster1, COLOR_PAIR(1)); //normale Farbkombination //Antwort ausgeben: for (i=0; i<=m; i++){ wprintw(fenster1, "%s ", woerter[m-i]); } wprintw(fenster1, "\n"); wrefresh(fenster1); refresh(); }while (strcmp(ch, "ENDE\n") != 0); //Solange bis Programm durch Abschied beendet wird endwin(); //Fenster schließen //DEN GANZEN MALLOKIERTEN BEREICH FREIGEBEN!! //for (i=0; fld[i]!=NULL; i++) free (fld[i]); letztes Feld muss NULL gesetzt worden sein // free (fld); }
Das Problem:
Wie kann man es bewerkstelligen, dass die Fenstergröße NICHT verändert werden kann?
Bei mir wird bei jeder Größenänderung der gesamte Textkörper "durcheinandergewurschtelt" - das will ich verhindern.
Wenn ihr aber - wovon ich ausgehe - eine bessere Variante für o.g. Quelltext habt (also wo ich die Fenstergröße ändern kann, aber der Text lesbar bleibt), her damit!!!!!Der Code ist sicher nicht der beste -> blutiger Anfänger
Bin für jede Hilfe/Anregung dankbar.
-
Ich hätte nicht gedacht, dass ich das je sagen würde, aber Du hast da viel zu viele Kommentare drin, das ist echt unlesbar.
Speicher "allokiert" man übrigens, malloc steht nur für "allocate memory"/ "memory allocation".