[CAPÍTULO 1] - [CAPÍTULO 2] - [CAPÍTULO 3]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6]
[PARTE 1] - [PARTE 2] - [PARTE 3] - [PARTE 4] - [PARTE 5] - [PARTE 6]
typedef, ponteiros para funções e union
Exemplo
#ifndef MENU_H
#define MENU_H
typedef struct item {
char * str;
void(* fun)(void);
struct item * sub;
struct item * sup;
struct item * nxt;
struct item * prv;
} Item;
void addMenuItem (const char * str, void(* fun)(void));
void addMenuSubItem (const char * str_i,const char * str_si, void(* fun)(void));
void loopMenu(void);
#endif
/** menu.c */ #include <stdlib.h> #include <stdio.h> #include <conio.h> #include "buffer.h" #include "menu.h" Item * menu; Item * menu_sel; int sub_items_visible; ...
Exemplo
/** menu.c */
...
void addMenuItem (const char * str, void(* fun)(void)) { /** PARAM PONT. FUNCAO */
Item * ptr;
if ( menu == NULL ) {
menu = (Item *) malloc(sizeof (Item));
ptr = menu;
ptr->prv = NULL;
} else {
ptr = menu;
while ( ptr->nxt ) {
if ( strcmp(ptr->str,str) == 0 )
return;
ptr = ptr->nxt;
}
ptr->nxt = (Item *) malloc(sizeof (Item));
ptr->nxt->prv = ptr;
ptr = ptr->nxt;
}
ptr->str = strdup(str);
ptr->fun = fun; /** ATRIBUICAO PONTEIRO FUNCAO **/
ptr->sub = NULL;
ptr->sup = NULL;
ptr->nxt = NULL;
}
...
{
...
case ENTER:
if ( menu_sel->fun )
(*(menu_sel->fun))(); /** CHAMADA FUNCAO VIA PONTEIRO **/
else
...
}
#define ENTER 13
#define ESC 27
#define RTARR 77
#define LTARR 75
#define UPARR 72
#define DWARR 80
union u_type{
int i;
char ch;
} ich;
void loopMenu() {
while ( 1 ) {
ich.i = getch();
switch ( ich.ch ) {
case ENTER:
....
CÓDIGO COMPLETO
O código abaixo implementa um sistema de menus para um programa de controle acadêmico./** main.c */
#include <stdio.h>
#include <stdlib.h>
#include "menu.h"
void f() {
printf("function activation!");
getch();
}
extern Item * menu;
extern Item * menu_sel;
extern int sub_items_visible;
int main(int argc, char *argv[])
{
addMenuItem("CADASTRO",NULL);
addMenuItem("MATRICULA",NULL);
addMenuItem("RELATORIO",NULL);
addMenuSubItem("CADASTRO","Alunos",f);
addMenuSubItem("CADASTRO","Professores",f);
addMenuSubItem("CADASTRO","Disciplinas",f);
addMenuSubItem("MATRICULA","Matriculas",f);
addMenuSubItem("MATRICULA","Turma",f);
loopMenu();
return 0;
}
#ifndef MENU_H
#define MENU_H
typedef struct item {
char * str;
void(* fun)(void);
struct item * sub;
struct item * sup;
struct item * nxt;
struct item * prv;
} Item;
void addMenuItem (const char * str, void(* fun)(void));
void addMenuSubItem (const char * str_i,const char * str_si, void(* fun)(void));
void loopMenu(void);
#endif
/** menu.c */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include "buffer.h"
#include "menu.h"
Item * menu;
Item * menu_sel;
int sub_items_visible;
void addMenuItem (const char * str, void(* fun)(void)) {
Item * ptr;
if ( menu == NULL ) {
menu = (Item *) malloc(sizeof (Item));
ptr = menu;
ptr->prv = NULL;
} else {
ptr = menu;
while ( ptr->nxt ) {
if ( strcmp(ptr->str,str) == 0 )
return;
ptr = ptr->nxt;
}
ptr->nxt = (Item *) malloc(sizeof (Item));
ptr->nxt->prv = ptr;
ptr = ptr->nxt;
}
ptr->str = strdup(str);
ptr->fun = fun;
ptr->sub = NULL;
ptr->sup = NULL;
ptr->nxt = NULL;
}
void addMenuSubItem (const char * str_i,const char * str_si, void(* fun)(void)) {
Item * ptr;
ptr = menu;
while ( ptr ) {
if ( strcmp(ptr->str,str_i) == 0 )
break;
ptr = ptr->nxt;
}
if ( ptr == NULL )
return;
if ( ptr->sub == NULL ) {
ptr->sub = (Item *) malloc(sizeof (Item));
ptr->sub->prv = NULL;
ptr->sub->sup = ptr;
ptr = ptr->sub;
} else {
ptr = ptr->sub;
while ( ptr->nxt ) {
if ( strcmp(ptr->str,str_si) == 0 ) {
ptr->fun = fun;
return;
}
ptr = ptr->nxt;
}
ptr->nxt = (Item *) malloc(sizeof (Item));
ptr->nxt->prv = ptr;
ptr->nxt->sup = ptr->sup;
ptr = ptr->nxt;
}
ptr->str = strdup(str_si);
ptr->fun = fun;
ptr->sub = NULL;
ptr->nxt = NULL;
}
void drawMenu(void) {
Item * ptr = menu, * sel_ptr;
int x = 1, y = 1 , sel_x;
int n = strlen( ptr->str);
while ( ptr ) {
if ( menu_sel == ptr || menu_sel->sup == ptr ) {
sel_ptr = ptr;
sel_x = x;
}
if ( menu_sel == ptr ) {
xyputs(x,y,">");
xyputs(x+n+4,y,"<");
}
xyputs(x+2,y,ptr->str);
x += n + 5 , ptr = ptr->nxt;
}
if ( sub_items_visible ) {
int i;
ptr = sel_ptr -> sub;
for (i = 0 ; i<n; i++ )
xyputs(sel_x+2+i,y+1,"-");
y +=2 ;
while ( ptr ) {
if ( menu_sel == ptr )
xyputs(sel_x,y,">");
xyputs(sel_x+2,y,ptr->str);
y++ , ptr = ptr->nxt;
}
}
}
#define ENTER 13
#define ESC 27
#define RTARR 77
#define LTARR 75
#define UPARR 72
#define DWARR 80
union {
int i;
char ch;
} ich;
void loopMenu() {
menu_sel = menu;
while ( 1 ) {
clearBuf();
drawMenu();
displayBuf();
ich.i = getch();
switch ( ich.ch ) {
case ENTER:
if ( menu_sel->fun )
(*(menu_sel->fun))();
else
if ( menu_sel -> sub ) {
sub_items_visible = 1;
menu_sel = menu_sel->sub;
}
break;
case ESC:
if ( menu_sel -> sup ) {
sub_items_visible = 0;
menu_sel = menu_sel->sup;
break;
} else
return;
case UPARR:
if ( menu_sel->sup && menu_sel->prv )
menu_sel = menu_sel->prv;
else
if ( menu_sel->sup ) {
sub_items_visible = 0;
menu_sel = menu_sel->sup;
}
else
sub_items_visible = 0;
break;
case DWARR:
if ( menu_sel -> sub ) {
sub_items_visible = 1;
menu_sel = menu_sel->sub;
} else
if ( menu_sel->nxt )
menu_sel = menu_sel->nxt;
break;
case LTARR:
if ( menu_sel->sup ) {
if ( menu_sel->sup->prv )
menu_sel = menu_sel->sup->prv;
} else
if ( menu_sel->prv )
menu_sel = menu_sel->prv;
break;
case RTARR:
if ( menu_sel->sup ) {
if ( menu_sel->sup->nxt )
menu_sel = menu_sel->sup->nxt;
} else
if ( menu_sel->nxt )
menu_sel = menu_sel->nxt;
break;
}
}
}
/** buffer.h */ #ifndef BUFFER_H #define BUFFER_H void clearBuf(void); void xyputs(unsigned short x, unsigned short y, const char * str); void displayBuf(void); #endif
/** buffer.c */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#define BUFW 80
#define BUFH 24
char buf[BUFH][BUFW];
void clearBuf(void){
int x,y;
for( y = 0; y < BUFH; y++ ) {
for( x = 0; x < BUFW; x++ )
buf[y][x] = ' ';
}
}
void xyputs(unsigned short x, unsigned short y, const char * str) {
x %= BUFW;
y %= BUFH;
for ( ; *str ; str++ ) {
switch( *str ) {
case '\n' : x = 0, y = (y + 1) % BUFH;
break;
case '\b' :
if ( x == 0 ) {
x = BUFW - 1;
y = y == 0 ? BUFH - 1 : y -1;
} else
x --;
break;
default :
buf[y][x] = *str;
x = (x+1)%BUFW;
y = x == 0 ? (y+1)%BUFH : y;
}
}
}
void displayBuf(void) {
//fseek(stdout,sizeof buf,SEEK_END);
system("cls");
fwrite(&buf,sizeof buf ,1,stdout);
}
Bibliografia e fonte:
- [CCT] Schildt, H. (1996) C, completo e total: 3a Ed.. São Paulo, Makron.
- LP, UFMA; Coutinho, Lucian. Linguagem de programação para ciencia da computação da ufma.http://www.deinf.ufma.br/~lrc/2009.1/LP/
- [K&R] KERNIGHAN, B. e RITCHIE, D. (1990) C, a linguagem de programação: padrão ANSI. Rio de Janeiro: Campus.
- DEITEL, H. M. (1999) Como programar em C. Rio de Janeiro: LTC.
- Módulo Consultoria e Informática (1989) Linguagem C: programação e aplicações. Rio de Janeiro: LTC.
Coloque aqui o seu email