Página 1 de 1
como fazer isso em C?

Enviado:
08 Jan 2009 23:58
por HC908
Bom amigos.
Gostaria de colocar no codigo apenas uma declaração e automaticamente o compilador criar uma função e uma variavel global. tipo
ex:
DeclareTask(CMD_RCV_SERIAL);
quando eu digita-se isso no codigo o compilador ter a inteligencia de criar uma função chamada void CMD_RCV_SERIAL(void) + uma variavel chamada char Status_CMD_RCV_SERIAL=0;.
Atualmente estou digitando toda vez q tenho declara uma TAREFA.
Gostaria de colocar isso automatico.
Desde ja agradeço.
Re: como fazer isso em C?

Enviado:
09 Jan 2009 00:02
por Renie
Olás Well,
Esse automatismo não depende de C, depende da IDE que você usar,
se ela tem ou não capacidade de autocompletar etc.
[]'s
Renie

Enviado:
09 Jan 2009 08:58
por HC908
Opa Dr. renie. Tudo bom, ja tentei de tudo. o maximo q consegui foi .
DeclareTask(CMD_RCV_SERIAL);
ele cria uma função chamada void CMD_RCV_SERIAL(void);
O compilador q estou usando é o C18 da microchip;

Enviado:
09 Jan 2009 09:42
por Rodrigo_P_A
HC908 escreveu:Opa Dr. renie. Tudo bom, ja tentei de tudo. o maximo q consegui foi .
DeclareTask(CMD_RCV_SERIAL);
ele cria uma função chamada void CMD_RCV_SERIAL(void);
O compilador q estou usando é o C18 da microchip;
e com macro, você num consegue?
acho que vc quer fazer algo do tipo uma Classe, em C++ é possível, acho que o C18 num suporta C++

Enviado:
09 Jan 2009 09:43
por msamsoniuk
nao dah para usar as macros do pre-processador?
#define DeclareTask(LABEL) LABEL(void) { char status_LABEL=0; }
inclusive vc pode gerar uma saida definitiva rodando o pre-processador a parte (cpp), praticamente um auto-codigo...aposto que a microsoft nao tem um botao auto-codigo no word hahaha
vc pode ateh tentar fazer um pseudo-c++ com macros hehehe

Enviado:
09 Jan 2009 10:08
por HC908
Opa Marcelo,
Este exemplo acredito q declarar uma variavel sem ser global não é?
é +- isso q eu quero, so queria q a varaivel vc declarada global.
+ mt obrigado pela força.
Marcelo Samsoniuk escreveu:nao dah para usar as macros do pre-processador?
#define DeclareTask(LABEL) LABEL(void) { char status_LABEL=0; }
inclusive vc pode gerar uma saida definitiva rodando o pre-processador a parte (cpp), praticamente um auto-codigo...aposto que a microsoft nao tem um botao auto-codigo no word hahaha

vc pode ateh tentar fazer um pseudo-c++ com macros hehehe

Enviado:
09 Jan 2009 11:18
por Djalma Toledo Rodrigues
CMD_RCV_SERIAL
void CMD_RCV_SERIAL(void)
Status_CMD_RCV_SERIAL=0;
Ctrl C, Ctrl V

Enviado:
09 Jan 2009 11:22
por HC908
eu ja faço isso já. quero automatico
Djalma Toledo Rodrigues escreveu:CMD_RCV_SERIAL
void CMD_RCV_SERIAL(void)
Status_CMD_RCV_SERIAL=0;
Ctrl C, Ctrl V

Enviado:
09 Jan 2009 11:57
por msamsoniuk
sem problemas:
#define DeclareTask(LABEL) char status_/**/LABEL ; \
LABEL(void) { status_LABEL=0; }
ele vai declarar a variavel como global, fora da funcao. o /**/ ou ## acho que eh necessario para concatenar as coisas nas macros, nao lembro, eu nunca uso macros.
por outro lado, para gerar corretamente segmentos de codigo assim, eu faria uma lista dos labels q eu quero e rodaria um programa em awk gerando os .h e .c automaticamente.
HC908 escreveu:Opa Marcelo,
Este exemplo acredito q declarar uma variavel sem ser global não é?
é +- isso q eu quero, so queria q a varaivel vc declarada global.
+ mt obrigado pela força.
Marcelo Samsoniuk escreveu:nao dah para usar as macros do pre-processador?
#define DeclareTask(LABEL) LABEL(void) { char status_LABEL=0; }
inclusive vc pode gerar uma saida definitiva rodando o pre-processador a parte (cpp), praticamente um auto-codigo...aposto que a microsoft nao tem um botao auto-codigo no word hahaha

vc pode ateh tentar fazer um pseudo-c++ com macros hehehe

Enviado:
09 Jan 2009 12:01
por HC908
vou testar mt obg pela força. é isso q eu quero so falta ver se da certo.

Enviado:
09 Jan 2009 12:44
por HC908
Não aceitou amigo. Se alguem souber algo pode postar.
Marcelo obrigado pela força
Marcelo Samsoniuk escreveu:sem problemas:
#define DeclareTask(LABEL) char status_/**/LABEL ; \
LABEL(void) { status_LABEL=0; }
ele vai declarar a variavel como global, fora da funcao. o /**/ ou ## acho que eh necessario para concatenar as coisas nas macros, nao lembro, eu nunca uso macros.
por outro lado, para gerar corretamente segmentos de codigo assim, eu faria uma lista dos labels q eu quero e rodaria um programa em awk gerando os .h e .c automaticamente.
HC908 escreveu:Opa Marcelo,
Este exemplo acredito q declarar uma variavel sem ser global não é?
é +- isso q eu quero, so queria q a varaivel vc declarada global.
+ mt obrigado pela força.
Marcelo Samsoniuk escreveu:nao dah para usar as macros do pre-processador?
#define DeclareTask(LABEL) LABEL(void) { char status_LABEL=0; }
inclusive vc pode gerar uma saida definitiva rodando o pre-processador a parte (cpp), praticamente um auto-codigo...aposto que a microsoft nao tem um botao auto-codigo no word hahaha

vc pode ateh tentar fazer um pseudo-c++ com macros hehehe

Enviado:
09 Jan 2009 12:53
por msamsoniuk
testei da seguinte forma:
- Código: Selecionar todos
#define DeclareTask(LABEL) char status_##LABEL ; \
LABEL(void) { status_##LABEL=1; }
DeclareTask(Task0);
DeclareTask(Task1);
int main()
{
printf("status of task is %d\n",Task0());
printf("status of task is %d\n",Task1());
return 0;
}
rodando um cpp no codigo, obtive:
- Código: Selecionar todos
# 1 "zuado.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "zuado.c"
char status_Task0 ; Task0(void) { return status_Task0=1; };
char status_Task1 ; Task1(void) { return status_Task1=1; };
int main()
{
printf("status of task is %d\n",Task0());
printf("status of task is %d\n",Task1());
return 0;
}
o que mostra que ele produziu corretamente (entao eh ##, nao /**/ o delimitador de macros no meu compilador)... entao eu compilei e ele funcionou corretamente!

Enviado:
09 Jan 2009 13:03
por HC908
Opa marcelo + uma vez obrigado, olha o seu exemplo funcionou em outro compilador o CCS + o compilador da microchip da erro de sintax. + pelo menos agora eu sei como criar. Valeu mt obrigado

Enviado:
10 Jan 2009 13:10
por HC908
CONSEGUI CONSEGUI CONSEGUI
Alou amgos consegui fazer o q estava querendo, seguindo o mesmo raciocionio do nosso amigo marcelo, esta o codigo abaixo. Com isso vai facilitar a minha vida quando no desenvolvimento do meu Kernel. valeu amigos e mt obrigado a todos.
struct TConfig_Task
{
char Status;
char Count_Timer;
};
#define TASK(TaskName) void TaskName(void)
#define DeclareTask(LABEL) struct TConfig_Task _##LABEL;\extern TASK(LABEL)
DeclareTask(Task0);
DeclareTask(Task1);
TASK(Task0)
{
}
void main(void)
{
}