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". 🙂


Anmelden zum Antworten