Programiranje u C-u

  

PRIMJER KODA ZA POKAZIVAČE NA FUNKCIJU
Pokazivači na funkciju dozvoljavaju kreiranje tablice skokova i dinamički izbor programa. Pokazivaču je pridružena početna adresa funkcije, stoga, tipkanjem imena pokazivača, izvršenje programa skače na funkciju gdje pokazivač pokazuje.

Korištenjem jednog pokazivača, različite rutine se mogu izvršiti jednostavnim preusmjeravanjem pokazivača na drugu funkciju. Stoga, ovo programi mogu koristiti za slanje informacija printeru, disku itd., jednostavno usmjeravanjem pokazivača povezanog sa izlazom na odgovarajuću izlaznu funkciju!

Slijedeći program prikazuje korištenje pokazivača na funkciju, na jednostavnom primjeru shell programa kojim utvrđujemo mod ekrana CGA sistema.

#include <stdio.h>      /* Funcptr.c */
#include <dos.h>

#define dim(x) (sizeof(x) / sizeof(x[0]) )
#define GETMODE        15
#define SETMODE         0
#define VIDCALL         0X10
#define SCREEN40        1
#define SCREEN80        3
#define SCREEN320       4
#define SCREEN640       6
#define VID_BIOS_CALL(x)  int86( VIDCALL, &x, &x )

int cls(), scr40(), scr80(), scr320(), scr640(), help(), shellquit();
union REGS regs;

struct command_table
{
  char *cmd_name;
  int (*cmd_ptr) ();
} cmds[]={"40",scr40,"80",scr80,"320",scr320,"640",scr640,"HELP",help,"CLS",cls,"EXIT",\
               shellquit};
cls()
{
  regs.h.ah = GETMODE;     VID_BIOS_CALL( regs );
  regs.h.ah = SETMODE;     VID_BIOS_CALL( regs );
}
scr40()
{
  regs.h.ah = SETMODE;
  regs.h.al = SCREEN40;
  VID_BIOS_CALL( regs );
}
scr80()
{
  regs.h.ah = SETMODE;
  regs.h.al = SCREEN80;
  VID_BIOS_CALL( regs );
}
scr320()
{
  regs.h.ah = SETMODE;
  regs.h.al = SCREEN320;
  VID_BIOS_CALL( regs );
}
scr640()
{
  regs.h.ah = SETMODE;
  regs.h.al = SCREEN640;
  VID_BIOS_CALL( regs );
}
shellquit()
{
   exit( 0 );
}
help()
{
   cls();
   printf("Raspoložive naredbe su; \n");
   printf("    40    Postavlja mod sa 40 stupaca\n");
   printf("    80    Postavlja mod sa 80 stupaca\n");
   printf("   320    Postavlja grafički mod srednje rezolucije\n");
   printf("   640    Postavlja grafički mod visoke rezolucije\n");
   printf("   CLS    Briše sve s ekrana\n");
   printf("  HELP    Poruke\n");
   printf("  EXIT    Povratak u DOS\n");
}
get_command( buffer )
char *buffer;
{
  printf("\nShell: ");
  gets( buffer );
  strupr( buffer );
}
execute_command( cmd_string )
char *cmd_string;
{
  int i, j;
  for( i = 0; i < dim( cmds); i++ )
  {
    j = strcmp( cmds[i].cmd_name, cmd_string );
    if( j == 0 )
    {
      (*cmds[i].cmd_ptr) ();
      return 1;
    }
  }
  return 0;
}

main()
{
  char input_buffer[81];
  while( 1 )
  {
    get_command( input_buffer );
    if( execute_command( input_buffer ) == 0 )
      help();
  }
}

©Copyright B Brown. 1984-1998. All rights reserved.