2015-03-26 4 views
0

Je n'arrive pas à afficher le texte sur la console et elle n'est pas non plus enregistrée correctement. J'ai les touches fléchées, j'entre, je recule et je travaille bien.getch() et le mélange des touches normales avec les touches fléchées

également un autre/petit/erreur, je ne suis pas vraiment est quand je presse esc et il sort du vide que je me dirigeais à ce morceau de code

#endif /* defined (_M_IX86) || defined (_M_X64) */ 
     __fastfail(FAST_FAIL_STACK_COOKIE_CHECK_FAILURE); 

intérieur de gc_report.c, que je Je ne trouve pas beaucoup d'information sur (ou au moins en rapport avec mon problème).

#define KEY_UP 72 
#define KEY_DOWN 80 
#define KEY_LEFT 75 
#define KEY_RIGHT 77 
#define KEY_ENTER 13 
#define KEY_BACKSPACE 8 
#define KEY_ESCAPE 27 

void texteditor(int x, int y,int kolommen,char textarr[20][20],int rijen=20) 
{ 
    int index = 0, indey = 0, keuze,lol = 20; 
    do{ 
     gotoxy(index + x, indey + y); 
     keuze = 0; 
     keuze = _getch(); 
     if (keuze == 0 || keuze == 0xE0 || keuze == 224) 
     { 
      keuze = _getch(); 
      gotoxy(index + x, indey + y); 
      switch (keuze) 
      { 
      case KEY_UP:indey--; 
       break; 
      case KEY_LEFT: index--; 
       break; 
      case KEY_DOWN:indey++; 
       break; 
      case KEY_RIGHT: index++; 
       break; 
      } 
      indey = (indey <= 0) ? 0 : (indey > kolommen) ? kolommen : indey; 
      index = (index <= 0) ? 0 : (index > rijen) ? rijen : index; 
     } 
      if (keuze == 32 || (keuze >= 46 && keuze <= 57) || (keuze <= 64 && keuze >= 126)) 
      { 
       textarr[index][indey] = (char)keuze; 
       std::cout << textarr[index][indey]; 
       index++; 
       index = (index <= 0) ? 0 : (index > rijen) ? rijen : index; 
      } 
      if (keuze == KEY_BACKSPACE) 
      { 
       index = index--; 
       gotoxy(index + x, indey + y); 
       std::cout << " "; 
       index = (index <= 0) ? 0 : (index > rijen) ? rijen : index; 
      } 
      if (keuze == KEY_ENTER) 
      { 
       index = 0; 
       indey++; 
       indey =(indey >= kolommen) ? kolommen : indey++; 
      }  
    } while (keuze != KEY_ESCAPE);} 

J'ai cherché aussi un peu sur les valeurs derrière les touches fléchées, où je trouve 37 (flèche gauche), 38 (flèche), 39 (flèche droite), 40 (flèche vers le bas) en tant que valeur ASCII alors quelle est la différence avec la mienne?

+1

Pour quel système est-ce? DOS? – Lundin

Répondre

1

Le jeu de caractères ASCII, comme son nom l'indique, décrit un jeu de caractères et non les touches du clavier. Pour cette raison, il n'y a pas de valeurs pour les touches fléchées en ASCII.

Au lieu de cela la fonction _getch() que vous utilisez est de retour soit 224 (E0h) ou 0 pour indiquer que ce qui suit est un code d'analyse des clés. Les valeurs que vous utilisez pour celles-ci sont correctes et vous pouvez les rechercher here.

Les autres valeurs que vous avez trouvées (37-40) sont appelées clés virtuelles et sont beaucoup plus courantes. par exemple, ils sont retournés en Javascript pour event.keyCode et aussi available in the WinApi mais ils ne sont pas applicables à votre exemple _getch().

Maintenant que cela est réglé, regardons votre exemple:

  • Vous pouvez supprimer le E0 comme il est égal à 224. Le tableau textarr que vous utilisez a les dimensions 20x20. Cela signifie que l'écriture au-delà de textarr[19][19] est un comportement indéfini.Vous comparez l'index de tableau pour être plus grand que que 20 avant d'utiliser rijen comme index de remplacement. Vous devriez plutôt avoir rijen être 19. De cette façon, vous n'avez pas l'accès hors de la limite. Je voudrais placer kolommen à côté de rijen. Cela n'a aucun sens d'avoir le tableau entre eux + cela vous empêche de définir une valeur par défaut pour cela.
  • Vous ignorez également beaucoup de caractères imprimables. Vous devriez structurer votre code pour avoir une autre condition à la fin, où vous vérifiez ensuite avec isprint() s'il est imprimable et ensuite l'imprimer.
  • Et maintenant la partie principale: if (... || (keuze <= 64 && keuze >= 126)). Voyez-vous le problème? Je suppose que vous vouliez dire (keuze >= 64 && keuze <= 126). La façon dont c'est maintenant vous ignorez toutes les lettres ASCII.
  • Peut-être que vous souhaitez effacer l'écran avant de commencer à courir texteditor(). system("cls") est la manière standard de Windows de le faire.

Autre chose, l'imbrication des expressions ternaires est laide. La parenthèse inutile que vous avez utilisée pour la condition serait beaucoup mieux autour de la deuxième expression ternaire. La console de Windows par défaut est 80x25, que vous pouvez utiliser au lieu de 20x20.

Et enfin, conio.h est un en-tête non standard et vous feriez mieux d'utiliser la fonctionnalité présente dans <windows.h> à la place. Ou éloignez-vous de la gestion des terminaux sous-optimale dans Windows et utilisez une bibliothèque comme ncurses avec un terminal approprié.

0

Les codes sont basés sur ansi.sys (qui nécessite des modules complémentaires pour fonctionner sur Windows moderne). Vous n'avez pas identifié le module complémentaire que vous utilisez. Peut-être que vous faites référence à une source comme l'article Daniweb how to detect arrow keys??.

Questions concernant les touches fléchées et getch (pour des raisons pratiques les mêmes que _getch - voir Difference between getch() and _getch()) ont été répondues avant:

Les codes utilisés pour gauche/droite/haut/bas sont basés sur le final caractère des séquences d'échappement reconnu par , par exemple, (selon ncurses):

kcub1=\0K, 
    kcud1=\0P, 
    kcuf1=\0M, 
    kcuu1=\0H, 

Mais le \0 peut exister d'autres caractères tels que \033[, \340, en fonction de la configuration. Ce dernier peut être le Windows Extended Prefix Code comme indiqué dans Scan Codes sur le forum CPlusPlus.