absolut kurioses problem - ka was fürn topic



  • moin

    ich habe ein komisches problem:

    ich lese einen string mit getnstr ( ncurses funktion ) ein.

    getnstr(buffer,n);

    nun gebe ich den eingelesenen string aus

    mvprintw(0,0,"TEXT: %s",buffer);

    auf dem bildschirm erscheint NIX. das kuriose ist: an einer stelle am programm baut er ein packet, in dem unteranderem buffer mit rein kopiert wird. gebe ich das packet als ganzes aus wird alles, samt buffer, ausgebgen.

    noch kurioses: ich habe mal unmittelbar nach dem einlesen parallel dazu noch den buffer in eine datei geschrieben, also folgender code

    getnstr(buffer,n);
    if ( ( fd = fopen("/home/smurf/KAQQA","w") ) == NULL)
    { endwin(); exit(0); }

    fprintf(fd,"%s\n",buffer);
    mvprintw(0,0,"TEXT: %s",buffer);

    der hammer: in der datei steht der inhalt von buffer, auf dem screen kommt nix
    ( es hat nix damit zu tun das refresh muss oder sonstwas, man sieht ja wie er was ausgeben "will", das caret rückt auch nach rechts, aber er gibt halt nix aus )

    wie kann SOETWAS sein? als ob das nicht reicht, weiteres kurioses:

    der input, also das was man grade schreibt, wird ja ausgeben, also zb bei der funtkion getnstr. wenn man aber 2mal das gleiche angibt, wird das nicht ausgeben!! zb

    ppppppppp <enter>
    ppppppppp
    es wird nix angezeigt!! allerdings wird das wohl eingelesen, denn es steht hinterher in der datei, es kommt ins packet, an den server, etc. es wird nur net angezeigt, von printw auch net

    kann das einer nachvollziehen was ich meine und sagen wodrann SOWAS liegen kann? ich verzweifele, bin für jede anregung dankbar!

    mfg der sohn



  • Versuche mal, deinen Code auf ein Minimum zusammenzustreichen, sodass der "Fehler" mit wenigen Zeilen gerade noch reproduziert werden kann. Dann poste diesen Code.

    Martin G

    PS.: Das Forum kennt mich irgendwie nicht mehr, daher habe ich als "unregistrierter" geantwortet.



  • ya sicher:

    int main(int argc, char **argv)
    {

    int nutte;
    FILE *fd;
    /* Init ncurses */
    initscr();

    while(1){
    move(0,0);
    getnstr(buff_send,TEXTLIMIT);
    mvprintw(15,15,"%s",channel);
    getch();

    if ( ( fd = fopen("/home/smurf/KAQQA","w") ) == NULL)
    { endwin(); exit(0); }

    fprintf(fd,"%s\n",buff_send);
    fclose(fd)
    }

    auf dem monitor wird nix ausgeben, drück enter und guck dir den inhalt von /home/smurf/KAQQA an, und schwupps steht da drinnen was ich eingeben habe

    allerdings ist das nur ne teilrekonstruktion: der fehler, das beim 2mal hintereinander dasselbe eingeben, ist hier nicht gegeben; ka wieso

    mfg der sohn



  • mit dem letzen satz meinte ich:

    allerdings ist das nur ne teilrekonstruktion: der fehler, das beim 2mal hintereinander dasselbe eingeben, die eingabe nicht angezeigt wird, ist hier nicht gegeben; ka wieso



  • refresh() fehlt



  • wie oben gesagt, bin dem refresh hat das nix zu tun. ich kann da 100 ma refresh hinsetzen das tut nix

    ausserdem ist das EIGENTLICHE problem das bei dem einlesen mittels getnstr nicht mehr "geechod" ( also ausgeben was man eintippt ) wird, wenn man 2 ma hintereinander etwas gleiches eingibt. das printw den string nicht ausgibt ist nur ne weitere beobachtung, aber net das wesentliche



  • AHAHAHAH es scheint zu gehen

    ich habe einen aufruf von fork() durch ne andere routine ersetzt, sodass net mehr geforked wird

    mag ncurses keine fork 😕



  • sohn schrieb:

    ich habe einen aufruf von fork() durch ne andere routine ersetzt, sodass net mehr geforked wird

    mag ncurses keine fork 😕

    Man muss sich vor Augen führen, was fork() macht: Es dupliziert den gesamten Speicher des Programms, alle Variablen (ob auf dem Stack oder statisch) und auch alle Datei-Deskriptoren, Streams etc.
    Dadurch wird z. B. bei Datei-Streams (FILE) der Pufferinhalt ebenfalls dupliziert, sodass beim Schließen der Datei dieser Inhalt doppelt auftritt.
    Ich denke, ein ähnlicher Effekt ist bei dir aufgetreten, leider enthält dein Code-Auszug überhaupt kein fork(), sodass man das daran nicht analysieren kann.

    Näheres zu dem Verhalten von fork() findest du auch in meinem Buch "C und Linux". 😉

    Martin G.


Anmelden zum Antworten