ncurses: Ein & Ausgabe?



  • 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