J'apprends à programmer en C et que je souhaite pouvoir taper des caractères dans le terminal pendant que mon code est en cours d'exécution sans appuyer sur retour kbd>. Mon programme fonctionne, cependant, lorsque j'appelle initscr () code>, l'écran est effacé - même après avoir appelé
filtre () code>. La documentation pour
filtre code> suggère qu'il devrait désactiver l'effacement - mais ce n'est pas le cas pour moi.
#include <stdio.h>
#include <curses.h>
#include <term.h>
int main(void) {
int ch;
filter();
initscr();
cbreak();
noecho();
keypad(stdscr, TRUE);
while((ch = getch()) != EOF);
endwin();
return 0;
}
4 Réponses :
Utiliser newterm () code> au lieu de
initscr () code>, tu devrais être bien alors. Et n'oubliez pas
delScreen () code> si vous suivez ce conseil. P>
Bonjour, merci pour la réponse, j'ai essayé ce que vous avez dit et la fonctionnalité est la même - l'écran a été nettoyé à nouveau. À la place de initscr () code> j'ai
fichier * fOfen_id = fopen ("/ dev / tty", "r +"); Écran * TERMREF = NEWTERM (NULL, FILE_ID, FILE_ID); CODE> et au lieu de
endwin () code> J'ai
delScreen (TERMREF) CODE>.
Étrange mais cela ne clarme pas mon écran lorsque je l'utilise au lieu de initscr () code>. Je l'appelle comme
Newterm (null, stdin, stdout) code> cependant.
La seule raison pour laquelle il ne dégage pas votre écran, Mike, c'est que vous avez inversé les arguments à Newterm (). Il faut stdout, stdin, pas stdin, stdout. Je parie après la course de votre programme de test, votre entrée est folle? N'écho-t-il pas, peut-être? Si vous utilisez l'ordre d'argument correct pour Newterm (), il efface effectivement l'écran. Votre réponse est juste mal.
Pourquoi ne pas supprimer cette réponse?
Je suis tout pour cela, mais je ne peux pas sembler supprimer la réponse pendant qu'elle est acceptée @tedlyngmo. Toute aide est la bienvenue.
@ mike.dld je vois. Je me souviens maintenant que ça me passe aussi. Eh bien, cela répond à cette question. :-)
Extension de la réponse de Mike.dld, cela fonctionne pour moi sur MacOS X 10.6.6 (GCC 4.5.2) avec la bibliothèque System Curse - sans effacer l'écran. J'ai ajouté la possibilité d'enregistrer les caractères saisis (enregistrés dans un fichier "x") et la possibilité de taper contrôler-d kbd> et d'arrêter le programme plutôt que de forcer l'utilisateur à interrompre. #include <stdio.h>
#include <curses.h>
#include <term.h>
#define CONTROL(x) ((x) & 0x1F)
int main(void)
{
FILE *fp = fopen("x", "w");
if (fp == 0)
return(-1);
SCREEN *s = newterm(NULL, stdin, stdout);
if (s == 0)
return(-1);
cbreak();
noecho();
keypad(stdscr, TRUE);
int ch;
while ((ch = getch()) != EOF && ch != CONTROL('d'))
fprintf(fp, "%d\n", ch);
endwin();
return 0;
}
Cela précise l'écran pour moi (cela ne fonctionne donc pas).
@ NH2: Cela pourrait dépendre de votre type de terminal et de la saisie des malédictions que vous utilisez.
Fondamentalement, la malédiction est conçue pour prendre en charge l'écran (ou la fenêtre, dans le cas d'une borne vitrée). Vous ne pouvez pas vraiment mélanger des malédictions avec Stdio, et vous ne pouvez pas vraiment utiliser des malédictions pour simplement entrer ou sortir quelque chose sans gâcher avec le reste de l'écran. Il y a des solutions de contournement partielle, mais vous n'allez jamais vraiment pouvoir faire fonctionner la façon dont cela semble être comme vous le souhaitez. Désolé. P>
Je suggérerais de réécrire votre programme d'utiliser des malédictions tout au long ou d'enquêter sur des alternatives telles que Lisline. P>
Vous verriez votre écran effacé dans une demande de malédiction pour l'une de ces raisons: P>
initscr code> < / a> (qui efface l'écran) ou newterm < / Code>
sans première appelant filtre < / code>
ou li>
- L'initialisation du terminal efface l'écran (ou le rend apparaît pour effacer, en passant à l'écran alternatif). LI>
ul>
Dans ce dernier cas, vous pouvez supprimer la fonction d'écran alternative dans les ncurses en réinitialisant le Entract_ca_mode code> et EXIT_CA_MODE CODE> POINTERS sur NULL comme fait dans la boîte de dialogue code> . Mieux encore, choisissez une description du terminal qui fait ce que vous voulez. P>
Lecture ultérieure: p>
- Pourquoi l'écran ne fonctionne-t-il pas lorsque vous exécutez VI? ( FAQ Xterm) LI>
ul>
Pour les PDCurs, vous pouvez définir les variables d'environnement PDC_PRESERVE_SCREEN ou PDC_RESTORE_SREN sur n'importe quelle valeur: de l'historique des fichiers:
PDC_PRESERVE_SCREEN Si cette variable d'environnement est définie, les PDCurses n'effaceront pas l'écran sur le blanc par défaut sur Black au démarrage. Cela vous permet de superposer une fenêtre sur le dessus du fond de l'écran existant. Pdc_restore_screen Si cette variable d'environnement est définie, les PDCurs prendront une copie du contenu de l'écran au moment du démarrage des PDCurs; Initscr (), et quand endwin () est appelé, l'écran sera restauré.