2010-12-17 5 views
1

Quelle est la signification du code suivant:Quelle est la signification du code suivant?

//Keyboard map 
#define LEFT_ARROW  'P' 
#define RIGHT_ARROW  'Q' 
#define UP_ARROW  'K' 
#define DOWN_ARROW  'L' 
#define CANCEL   'F' 
#define HOME   'A' 
#define BLANK   'B' 
#define SIGN_TOGGLE  'G' 
#define KB_DECIMAL  'R' 
#define KB_ZERO   'S' 
#define KB_ONE   'C' 
#define KB_TWO   'D' 
#define KB_THREE  'E' 
#define KB_FOUR   'H' 
#define KB_FIVE   'I' 
#define KB_SIX   'J' 
#define KB_SEVEN  'M' 
#define KB_EIGHT  'N' 
#define KB_NINE   'O' 
#define ENTER   'T' 

Quelqu'un pourrait expliquer comment cela fonctionne et pourquoi ils ont défini de cette façon?

+0

Il serait utile si vous expliquez d'où cela vient. – chrisaycock

+2

On dirait que quelqu'un a joué une blague. – Robert

+0

@Robert: En fait, cela pourrait être légitime. S'il s'agit d'une liste de codes-clés, leur valeur n'a aucun effet sur la sortie de caractères – ughoavgfhw

Répondre

4

Ce ne sont que des constantes. Cela signifie que le préprocesseur passera par le code source et remplacera toute instance du mot suivant #define avec le caractère sur la droite, avant de compiler le code source. Donc, s'il y avait une ligne comme celui-ci dans le code:

char myChar = LEFT_ARROW; 

le preprocesor va changer ce code dans:

char myChar = 'P'; 

avant de compiler.

4

#define TOKEN REPLACEMENT est un preprocessor directive, il remplace toutes les occurrences de TOKEN dans REPLACEMENT, syntaxiquement.

Le but de votre extrait de code est d'attribuer des noms aux raccourcis clavier, ce qui signifie que si vous dites if (key == KB_NINE), le compilateur affiche if (key == 'O'). L'avantage d'utiliser correctement les préprocesseurs n'est pas seulement la lisibilité: il augmente également la maintenabilité, au cas où les constantes changeraient. Les définitions de clés semblent être absurdes: par exemple, KB_ONE est 'C', cependant, ce problème peut être résolu en quelques frappes en modifiant la constante à un endroit.

Voir aussi: http://en.wikipedia.org/wiki/C_preprocessor#Macro_definition_and_expansion

2

Ce sont le genre de clés que vous pouvez trouver sur la droite d'un clavier. Il n'y a pas de manière standard dans le runtime C de laisser un programme reconnaître ces frappes. Il y a donc eu toutes sortes d'extensions non standard pour résoudre ce problème.

Un schéma consiste à laisser getch() retourner 0 lorsqu'une telle touche étendue est enfoncée, l'appel getch() suivant renvoie alors un code clé pour cette clé étendue. Ce code clé peut être le code d'analyse du clavier original. Tout est possible, vous devez connaître le fournisseur de clavier d'origine et le fournisseur CRT pour avoir un indice. Il est clair qu'il est ancien, les interfaces clavier propriétaires étaient une excellente stratégie de verrouillage des fournisseurs dans les jours néolithiques de l'informatique.

+0

Ce sont des codes valides. et je sais comment le travail de préprocesseur. Ma question est pourquoi ils ont représenté comme ça? Quelqu'un sait cela? – arocon

+1

Ceci est impossible tant que vous n'avez pas documenté le clavier et le CRT que vous utilisez. –

Questions connexes