Obligement - L'Amiga au maximum

Samedi 22 juillet 2017 - 12:43  

Translate

En De Nl Nl
Es Pt It Nl


Rubriques

 · Accueil
 · A Propos
 · Articles
 · Galeries
 · Glossaire
 · Hit Parade
 · Liens
 · Liste jeux Amiga
 · Quizz
 · Téléchargements
 · Trucs et astuces


Articles

 · Actualité (récente)
 · Actualité (archive)
 · Comparatifs
 · Dossiers
 · Entrevues
 · Matériel (tests)
 · Matériel (bidouilles)
 · Points de vue
 · En pratique
 · Programmation
 · Reportages
 · Tests de jeux
 · Tests de logiciels
 · Tests de compilations
 · Articles divers

 · Articles in english
 · Articles in other languages


Twitter

Suivez-nous sur Twitter




Liens

 · Sites de téléchargements
 · Associations
 · Pages Personnelles
 · Moteurs de recherche
 · Pages de liens
 · Constructeurs matériels
 · Matériel
 · Autres sites de matériel
 · Réparateurs
 · Revendeurs
 · Presse et médias
 · Programmation
 · Développeurs logiciels
 · Logiciels
 · Développeurs de jeux
 · Jeux
 · Autres sites de jeux
 · Scène démo
 · Divers
 · Informatique générale


Jeux Amiga

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Trucs et astuces

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Glossaire

0, A, B, C, D, E, F,
G, H, I, J, K, L, M,
N, O, P, Q, R, S, T,
U, V, W, X, Y, Z


Partenaires

Annuaire Amiga

Amedia Computer

Relec

Hit Parade


Contact

David Brunet

Courriel

 


Programmation : C - entrées/sorties sur une fenêtre RAW
(Article écrit par Barrou Diallo et extrait d'Amiga News - octobre 1993)


Nous revoilà ensemble pour un nouvel épisode de C.

Solution du précédent article

Tout d'abord, j'espère que le petit exercice de la dernière fois ne vous a pas trop impressionné et pour ceux qui auraient eu du mal à trouver la solution, la voici : la Macro 1 permettait d'extraire les j bits à droite de la position k dans l'entier x.

Eh oui, ce n'était pas bien difficile. Cette macro est d'ailleurs équivalente à (x DIV 2^k) MOD 2^j. Avec la fonction DIV qui symbolise la division entière et MOD le reste d'une division entière.

La seconde macro permettait tout simplement d'échanger le contenu de deux variables sans passer par une variable intermédiaire ! Le tout grâce aux opérateurs logiques dont on ne peut plus se passer, une fois qu'on y a goûté !

Programme du jour

Suite à la demande de lecteurs, nous allons nous intéresser aujourd'hui à des entrées-sorties sur une fenêtre dite RAW, adressable comme un vulgaire flux de données allant et venant d'un fichier. Cette technique est, il faut le rappeler, propre à l'Amiga, malgré que les codes d'échappements utilisés soit des codes ANSI.

En effet, il est possible d'ouvrir une fenêtre ayant les mêmes caractéristiques qu'une fenêtre CLI/Shell. Ceci est dû au fait que ces fenêtres sont des périphériques DOS comme les autres. On peut lire, écrire et changer leur mode d'accès comme dans un fichier classique.

Commençons tout de suite avec le début d'un programme qui nous servira d'exemple tout au long des explications :

#include  /* Pour Open/Close... */
#include  /* Pour printf()...*/
#include  /* Pour exit()... */
#include  /* Pour strlen() */
 
#ifndef NOPROTO
#ifndef PROTO
#define PROTO(arg) arg
#endif
#else
#ifndef PROTO
#define PROTO(arg) ()
#endif
#endif

Tout bon programme C doit commencer par des inclusions permettant de définir les prototypes des fonctions qu'il utilise. Les tests préprocesseurs concernant la constante PROTO permettent de bien définir le prototype d'une fonction suivant le compilateur. Certains ne veulent pas d'arguments, d'autres les exigent. Pour les premiers, on définira NOPROTO.

void OpenConsole PROTO((void));
void CloseConsole PROTO((void));

Voici les deux prototypes des fonctions principales qui, respectivement, ouvriront et fermeront une fenêtre console. Nous essayons de travailler surtout sous forme de macros préprocesseur pour le reste des actions qui sont souvent très courtes.

struct FileHandle *flux;
long dosbase;
char tampon[1024];

Nous déclarons trois variables globales (globales pour simplifier l'explication, mais à éviter à tout prix dans les programmes). La variable "flux" sera l'équivalent du descripteur de fichier dans lequel nous voulons lire et écrire. Cette structure est habituellement stockée dans le fichier d'inclusion dos/dosextens.h et contient le lien logique entre un process DOS et EXEC. La variable "dosbase" nous servira de descripteur pour l'ouverture de la bibliothèque standard dos.library. Quant au "tampon", il servira de zone où seront stockées les données.

/* Fonction qui permet d'ouvrir une console */
void OpenConsole()
{
   if (!(dosbase=OpenLibrary("dos.library",OL)))
      exit(1);

   if (!(flux=(struct FileHandle *)Open(FENETRE, MODE_NEWFILE)))
      {
         printf("Impossible d'ouvrir la fenêtre d'entrées-sorties");
         exit(2);
      }
}

La première opération consistera à ouvrir la dos.library, et s'il y a un échec (ce qui est rare), on quittera le programme avec le code retour 1, que l'on pourra tester avec "fault" et "failat" sous le Shell). Puis, il faudra ouvrir ce fameux flux avec la fonction Open. Remarquons qu'il nous manque la définition de FENETRE qu'il faudra ajouter au début du programme :

#define FENETRE "con:50/40/400/220/AmigaNews/NOSIZE/CLOSE0"

La fenêtre s'ouvrira aux coordonnées écrans 50,45 et aura une largeur de 400 pour une hauteur de 220. Son titre sera "AmigaNews" et ses attributs CLOSE et NOSIZE. D'autres attributs sont bien sûr possibles comme SMART, SIMPLE, NODRAG, WAIT ou NOBORDER.

void CloseConsole()
{
   Close(flux);
   CloseLibrary(closbase);
}

Ceci est la définition de la fonction qui clôturera la session console et fermera la bibliothèque DOS. Mais passons aux fonctions les plus importantes qui sont celles qui permettent effectivement les entrées-sorties :

#define WRITE(txt) {int len=strlen(txt); if(len) Write(flux,txt,len);}
#define READ(txt) {int len=Read(flux,txt,1024-1); *(txt+len)=0;}

Il suffit de taper WRITE("mon texte") pour voir apparaître ce texte dans la fenêtre, ou READ(buffer) pour trouver le texte tapé au clavier dans la zone tampon. Ces macros sont essentiels et seront la base de celles qui suivent. Nous allons maintenant modifier les attributs d'affichage et donner la possibilité d'écrire en gras, italique, etc.

#define GRAS ON WRITE("x9b""1m");
#define GRAS_OFF WRITE("x9b""22m");
#define ITALIQUE_ON WRITE("x9b""3m");
#define ITALIQUE_OFF WRITE("x9b""23m");
#define SOULIGNE_ON WRITE("x9b""4m");
#define SOULIGNE_OFF WRITE("x9b""24m");
#define INVERSE_OFF WRITE("x9b""7m");
#define INVERSE_OFF WRITE("x9b""27m");

Toujours sous forme de macros, nous pouvons déplacer le curseur, le désactiver, effacer l'écran ou même le faire flasher :

#define GOTOXY(x,y) sprintf(tampon,"x9b%d;%d;H0",x,y); WRITE(tampon);
#define CURSEUR ON_WRITE("x9b""p");
#define CURSEUR_OFF WRITE("x9b""0");
#define CLS WRITE("x0c");
#define BEEP WRITE("x07");

Passons aux choses sérieuses : le test de toutes ces macros avec un programme principal qui reprend la plupart d'entre elles et les exécute en ayant pris soin d'avoir ouvert une fenêtre.

Le programme se terminera automatiquement, mais sans fermer la console. C'est laissé au gré de l'utilisateur grâce au gadget du coin supérieur gauche !

void main(void)
{
   char buffer[1024];

   OpenConsole();

   ITALIQUE_ON; WRITE("On est en italique...");
   ITALIQUE_OFF;
   GRAS_ON;
   WRITE("On est en gras..." );
   GRAS OFF;
   INVERSE_ON;
   WRITE("On est en inverse vidéo...");
   INVERSE_OFF;
   WRITE("taper sur Entrée pour continuer:");
   READ(buffer);
   CLS; BEEP;
   GOTOXY(2,10);
   WRITE("On a tout effacé en musique (ou flash)...");

   CloseConsole();
}

Bien, voilà nos entrées-sorties effectuées, il est possible à partir de ces exemples de tester des touches spéciales comme les touches de fonctions. Amusez-vous bien et A+.


[Retour en haut] / [Retour aux articles] [Article précédent]