ncurses: Ein & Ausgabe?



  • hallo

    ich versuche meinen chat clienten mit ncurses zu schreiben, allerdings komme ich garnicht auf die Ein & Ausgabe klar. zb folgender stück code

    /* Get channel name from user */
    mvprintw(15,10,"\nType ur channel\n");
    bytes = readw(channel,12);

    /* send it to server and wait for response */
    send(sockfd, channel, bytes,0);
    mvprintw(20,20,"wait for auth. ur channel...");
    fflush(stdout);
    refresh();

    /* Get the channel requested from server, save and \0 terminate it */
    recv(sockfd, channel_recv, bytes,0);
    channel_recv[bytes-1] = '\0';
    printw("Ur Channel: %s\nType enter to go", channel_recv);
    fflush(stdout);

    mvprintw(15,10,"\nType ur channel\n");
    er berücksichtigt hier irgendwie nur den y wert, der x wert wird wohl net beachtet da das immer ganz links steht

    mvprintw(20,20,"wait for auth. ur channel...");
    das hier kommt nur wenn ich dadrunter ein refresh setze oder ein getch() allerdings funktioniert das programm dann auch net mehr richtig sondern spiel nur verrückt

    printw("Ur Channel: %s\nType enter to go", channel_recv);
    das kommt irgendwie auch nie

    usw usw. ich kapiere das nicht. ich habe ein beispiel code ausm tutorial, wo das alles einwandfrei klappt, und ich weiss nicht was ich machen soll, probiere seit stunden

    achja: readw ist eine eigene geschriebene routine, da ncurse net ma ne function hat mit der man strings einlesen kann und die zahl der gelesenen zeichen zurückbekommt

    hoffe mir kann da wer helfen, weil bisher klappt das mit den ncurses 0 😞

    danke



  • mach mal ein minimal-Beispiel. Wenn du dabei nicht selber den Fehler findest, kannst du das ja hier posten.



  • die minimal beispiele funktionieren ja immer. an meiner readw funktion kanns auch nicht liegen, da einfache sachen, die ich in meinem programm eingebaut habe ( standard funktionen verwendet ) auch nie gingen. die beispiele aus dem tutorial aber schon. zb folgender stück code aus dem tutorial welcher geht

    #include <curses.h>
    #define MAX 100
    
    int main()
    {
       char string[MAX],p[1];
       char string2[MAX];
       char string3[] = "Dies ist der neue String3\n";
       int c;
    
       initscr();    /*curses initialisieren*/
       printw("Bitte Eingabe für String machen : ");
       getnstr(string,MAX);
       mvprintw(3,0,"Bitte Eingabe für 2. String machen : ");
       getnstr(string2,MAX);
       mvprintw(7,20,"String ist gleich : %s\n",string);
       mvprintw(8,20,"Diese Zeile wird nun mit deleteln() gelöscht\n");
       mvprintw(9,20,"String 2 ist gleich : %s\n",string2);
    
       mvprintw(14,20,"Weiter mit TASTE");
       noecho();
       c=getch();
    
       move(8,20);
       deleteln();    /*Zeile löschen*/
       noecho();
       c=getch();
       move(8,20);
       insertln();    /*Leerzeile einfügen*/
       mvprintw(8,20,string3);
       noecho();
       c=getch();
    
       clear();     /*Bildschirm löschen*/
       refresh();
       mvprintw(12,38,"ENDE");
       halfdelay(20);    /*Wartet 20 Zehntelsec. auf getch()*/
    /*ansonsten beendet sich das Progr. selber*/
    
       c=getch();
    
       endwin();
       return 0;
    }
    

    so nun etwas von mir, etwas vereinfacht

    int main(int argc, char **argv)
    {
    	initscr();    /*curses initialisieren*/
    
    	mvprintw(20,20,"testtest");
    	mvgetnstr(20,25,buff_send,10);
    	mvprintw(25,30,"%s",buff_send);
            endwin();
    	exit(0);
    }
    

    da kommt dann auf der console son muell raus:

    testtpeter
    bash-2.05b$

    da steht halt testtest, das input-caret mittem im testest, und wenn ich was eingebe ist einfach hängen im schacht nach enter drücken



  • der code von mir ein post drüber ist quatsch, hab da y und x verwendet. nehmen wir den hier

    int main(int argc, char **argv)
    {
    initscr(); /*curses initialisieren*/

    mvprintw(10,10,"testtest");
    mvgetnstr(15,10,buff_send,10);
    mvprintw(20,20,"%s",buff_send);
    getch();
    endwin();
    exit(0);
    }

    der letzte mvprintw aufruf erscheint nur wenn ich ein getch drunter setze, ein sleep oder ganix, dann erscheint das nicht



  • noch ein beispiel:

    if ((childpid = fork())==0){
    move(20,20);
    while( 0 < ( P=readw(buff_send, TEXTLIMIT-1)))
    {
    /* kram vom programm hier irrelevant */
    move(20,20);
    }

    }

    das erste move bewirkt auch wirklich das an 20 20 eingelesen wird. nach dem ende soll aber wieder an 20 20 gegangen werden und von da eingelesen werden. funktioniert auch net, der liest immer oben links ein



  • mist das ich net editieren kann, naja noch ein beispiel

    mvprintw(5,5,"Enter ur nick:\t");
    
    	bytes_read = readw(nick,NICKLIMIT+1);
    	/* blabla, einige rechensachen, haben nix mit ncurses zu tun */
    	mvprintw(7,5,"\nUr nick is %s\nhere we go °_°\n",nick);
    /*....*/
    mvprintw(9,5,"\nType ur channel\n");
    

    das sieht dann so aus

    Enter ur nick:     peter
    
    Ur nick is peter
    here
    Type ur channel
    

    ok ich denke mein problem sollte nun verständlich sein 🙂



  • Hallo!

    Mit forks und ncurses würde ich aufpassen, ich weiß nicht ob die zwei sich vertragen.
    Zu deinem Problem dass man nichts sieht:
    man refresh / wrefresh



  • int main(int argc, char **argv)
    {
    initscr(); /*curses initialisieren*/

    mvprintw(10,10,"testtest");
    move(15,15);
    readw(buff_send,10);
    mvprintw(20,20,"%s",buff_send);
    move(1,1);
    readw(buff_send,10);
    mvprintw(5,5,"%s", buff_send);
    getch();
    endwin();
    exit(0);
    }

    das hier zb geht wieder problemlos und der macht was ich will 😕 aber die sachen oben sind doch EXAKT dasselbe

    ich verstehe das einfach nicht



  • moin & erstma danke 🙂

    mh wieso vertragen sich fork und ncurses nicht? und was soll ich stattdessen machen, vertragen sich denn threads und ncurses?

    ja aber mit dem refresh hat wieder die wirkung das man enter drücken muss....



  • peter.peter schrieb:

    int main(int argc, char **argv)
    {
    	initscr();    /*curses initialisieren*/
    
    	mvprintw(10,10,"testtest");
    	mvgetnstr(15,10,buff_send,10);
    	mvprintw(20,20,"%s",buff_send);
    	getch();
    	endwin();
    	exit(0);
    }
    

    der letzte mvprintw aufruf erscheint nur wenn ich ein getch drunter setze, ein sleep oder ganix, dann erscheint das nicht

    da fehlt das refresh(); Weiß zwar nicht wieso's beim getch() automatisch passiert, aber vor einem sleep o.ä. brauchst du das.



  • achja: zu dem zeitpunkt wo die probleme anfangen wurde noch nix geforked! die probs sind schon weit vorher. bis ich beim fork bin ist das programm schon längst hinüber ( alles kacke formatiert, dauernd muss man enter drücken, manchma gehts weiter, meistens kackt das dingen ab, etc )



  • das von mir zitierte Beispiel tut's genau wie es soll 😕

    bzgl. threads - ich glaube du solltest nicht aus verschiedenen Threads auf das ncurses-Fenster zugreifen.



  • mhmh @greenthumb, ich poste hier mal eine ganze funktion, sieht etwas chaotisch aus da ich die ganze zeit den ganzen code umwurschtel aber naja

    #include "unp.h"
     #include "client_header.h"
     void nick_channel(void)
     {
     	int c;
     	mvprintw(5,5,"Enter ur nick:\t");
    	//fflush(stdout);
    
    	bytes_read = readw(nick,NICKLIMIT+1);
    
    	//printw("\nBYTES_READ: %d\n", bytes_read);
    	len = bytes_read;
    	//printw("LEN: %d\n", len);
    
    	/* Check if the username have the right length */
    	if ( (len < NICKMIN) || (len == NICKLIMIT) ) {
    		printw("\nHere are only Nicks with 2-8 chars allowed -.-\n\n");
    		close(sockfd);
    		if(bytes_read==NICKLIMIT+1)
    			empty();
    		exit(0);
    	}
    
    	/* Null terminate the nick */
    	//nick[bytes_read] = '\0';
    
    	mvprintw(7,5,"\nUr nick is %s\nhere we go °_°\n",nick);
    	getch();
    	/* Put the char, after which u type ur message, at the end of the nick. */
    	nick[bytes_read-1] = '>';
    
    	/* Get channel name from user */
    	mvprintw(9,5,"\nType ur channel\n");
    	//bytes = read(0,channel,12);
    	bytes = readw(channel,12);
    
    	/* send it to server and wait for response */
    	send(sockfd, channel, bytes,0);
    	//puts("wait for auth. ur channel...");
    	mvprintw(11,5,"wait for auth. ur channel...\n");
    	fflush(stdout);
    
    	/* Get the channel requested from server, save and \0 terminate it */
    	recv(sockfd, channel_recv, bytes,0);
    	channel_recv[bytes-1] = '\0';
    	//printf("Ur Channel: %s\nType enter to go", channel_recv);
    	mvprintw(13,5,"Ur Channel: %s\nType enter to go", channel_recv);
    	fflush(stdout);
    	refresh();
    }
    

    die ausgabe ist wieder erwarten der da

    so fängt das an

    Enter ur nick:
    

    ich entere also meinen nick, dann siehts so aus ( nach enter druck )

    Enter ur nick:     peter
    
    Ur nick is peter
    here we go °_°
    

    ich drücke wieder enter wo dann das kommt

    Enter ur nick:     peter
    
    Ur nick is peter
    here 
    Type ur channel
    

    😕 aha naja ich gebe channel ein drücke enter dann siehts so aus

    Enter ur nick:     peter
    
    Ur nick is peter
    here 
    Type ur channel
    sohn
    

    und damit ist das programm abgeschmiert nix geht mehr



  • das beispiel kann man ja jetzt wieder nicht testen...

    aber ncurses mit Standard-Ausgabe-Funktionen zu mischen ist nicht gut, lass mal das fflush(stdout) weg, bzw. ersetze es durch refresh().



  • ich weiss jetzt auch net wie ich es testbar machen soll, mache das ganze mit kdevelop, aber wenn ich das ausserhalb von kdevelop mit make machen will komtm immer ein fehler was die threads angeht, der scheint wohl net die thread lib einzubinden, ich weiss aber jetzt auch net wie ich die make file machen soll damit das geht....

    naja jedenfalls hab ich die fflush(stdout); sachen rausgenommen, geht aber irgendwie immer noch net 😞



  • hab irgendwie die ganze scheisse jetzt abgeschossen, also das projekt, und musste es löschen und ne ältere version zurückspielen wo jetzt noch ganix mit den ncurses ist. ich werde das nochmal ganz neu probieren, hilft ja alles nix


Anmelden zum Antworten