Montando um construtor

To tentando entender os conceitos apresentados por um doido ae...
to com problema em definir
rtc_release(), para tornar ptr = null (resolvido) e assim garantir a reinicializacao de rtc na proxima chamada rtc_get
e em como melhorar a definicao de acesso aos membros da estrutura
(talvez um esquema mais poderoso de ponteiro pra funcao)...
eu nao sei se o uso de defines para acesso as variaveis é a melhor
maneira...se tem outras tecnicas de acesso a funcoes via ponteiro pra funcao, essas coisas... ajuda ae.. hehehehehe
algumas coisas precisam ser acrescentadas no modulo ou mesmo na mudanca dos defines para evitar por exemplo de voce ter que fazer varios acessos ao device para alterar um valor. Nao sei ate que ponto preciso pensar nisso...
e por ae vai...
Com a palavra oces e o doido hehehehe
to com problema em definir
rtc_release(), para tornar ptr = null (resolvido) e assim garantir a reinicializacao de rtc na proxima chamada rtc_get
e em como melhorar a definicao de acesso aos membros da estrutura
(talvez um esquema mais poderoso de ponteiro pra funcao)...
eu nao sei se o uso de defines para acesso as variaveis é a melhor
maneira...se tem outras tecnicas de acesso a funcoes via ponteiro pra funcao, essas coisas... ajuda ae.. hehehehehe
algumas coisas precisam ser acrescentadas no modulo ou mesmo na mudanca dos defines para evitar por exemplo de voce ter que fazer varios acessos ao device para alterar um valor. Nao sei ate que ponto preciso pensar nisso...
e por ae vai...
- Código: Selecionar todos
// Includes
#include <stdio.h>
#include <stdlib.h>
// Defines de acesso (macros)
// escrita
#define rtc_set_dia(x) rtc(RTC_READ)->dia = x
#define rtc_set_mes(x) rtc(RTC_READ)->mes = x
#define rtc_set_ano(x) rtc(RTC_READ)->ano = x
#define rtc_set_hor(x) rtc(RTC_READ)->hor = x
#define rtc_set_min(x) rtc(RTC_READ)->min = x
#define rtc_set_seg(x) rtc(RTC_READ)->seg = x
#define rtc_set_dds(x) rtc(RTC_READ)->dds = x
// leitura
#define rtc_set_data(d,m,a) rtc_set_dia(d); rtc_set_mes(m); rtc_set_ano(a)
#define rtc_set_horario(h,m,s) rtc_set_hor(h); rtc_set_min(m); rtc_set_seg(s)
#define rtc_valor() *rtc(RTC_READ)
#define rtc_get_dia() rtc(RTC_READ)->dia
#define rtc_get_mes() rtc(RTC_READ)->mes
#define rtc_get_ano() rtc(RTC_READ)->ano
#define rtc_get_hor() rtc(RTC_READ)->hor
#define rtc_get_min() rtc(RTC_READ)->min
#define rtc_get_seg() rtc(RTC_READ)->seg
#define rtc_get_dds() rtc(RTC_READ)->dds
#define rtc_release() rtc(RTC_RELEASE)
// Typedefs
typedef unsigned char u08;
typedef unsigned short u16;
typedef unsigned int u32;
// Constantes
enum rtc_estado {RTC_READ, RTC_WRITE, RTC_RELEASE, RTC_LOCAL};
// Estruturas de dados
typedef struct {
u08 dia;
u08 mes;
u08 ano;
u08 hor;
u08 min;
u08 seg;
u08 dds;
} st_rtc;
// leitura, inicializacao e release
st_rtc *
rtc(u08 modo)
{
// inicializacao das variáveis
static st_rtc rtc, *ptr = NULL;
if (ptr == NULL)
{
// acesso ao device
// iniciar as variaveis do rtc
ptr = &rtc;
ptr->dia = 1;
ptr->mes = 2;
ptr->ano = 3;
ptr->hor = 4;
ptr->min = 5;
ptr->seg = 6;
ptr->dds = 7;
}
switch (modo)
{
case RTC_LOCAL:
// iniciar variaveis locais de outros modulos :)
break;
case RTC_READ:
// leitura do device
break;
case RTC_WRITE:
// escrita no device
break;
case RTC_RELEASE:
ptr = NULL;
break;
}
return ptr;
}
// atualizar tudo - falta terminar a read
void
rtc_set(st_rtc * valor)
{
*(rtc(RTC_READ)) = *valor;
}
// aplicativo de testes
int
main(int argc, char *argv[])
{
// usando como variavel local
st_rtc valor;
// iniciando a bagaca;
// *((st_rtc *) &valor) = *rtc(); // exdruxulo mais funciona kkkkkkkk
valor = rtc_valor(); // atribuindo a valor o conteudo de rtc
printf("valor - variavel local\n");
printf("dia = %u\n", valor.dia);
printf("mes = %u\n", valor.mes);
printf("ano = %u\n", valor.ano);
printf("hor = %u\n", valor.hor);
printf("min = %u\n", valor.min);
printf("seg = %u\n", valor.seg);
printf("dds = %u\n", valor.dds);
rtc_set_data(11,12,13);
rtc_set_horario(14,15,16);
valor = rtc_valor(); // atribuindo a valor o conteudo de rtc
printf("valor - variavel local\n");
printf("dia = %u\n", valor.dia);
printf("mes = %u\n", valor.mes);
printf("ano = %u\n", valor.ano);
printf("hor = %u\n", valor.hor);
printf("min = %u\n", valor.min);
printf("seg = %u\n", valor.seg);
printf("dds = %u\n", valor.dds);
rtc_release();
valor = rtc_valor(); // atribuindo a valor o conteudo de rtc
printf("valor - variavel local\n");
printf("dia = %u\n", valor.dia);
printf("mes = %u\n", valor.mes);
printf("ano = %u\n", valor.ano);
printf("hor = %u\n", valor.hor);
printf("min = %u\n", valor.min);
printf("seg = %u\n", valor.seg);
printf("dds = %u\n", valor.dds);
system("PAUSE");
return 0;
}
// fim de arquivo
Com a palavra oces e o doido hehehehe