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(); } }