como fazer isso em C?

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

como fazer isso em C?

Mensagempor HC908 » 08 Jan 2009 23:58

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.
Editado pela última vez por HC908 em 09 Jan 2009 08:59, em um total de 1 vez.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Re: como fazer isso em C?

Mensagempor Renie » 09 Jan 2009 00:02

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
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor HC908 » 09 Jan 2009 08:58

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;
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor Rodrigo_P_A » 09 Jan 2009 09:42

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++
Avatar do usuário
Rodrigo_P_A
Dword
 
Mensagens: 2237
Registrado em: 12 Out 2006 18:27
Localização: Osasco - S.P - Brasil

Mensagempor msamsoniuk » 09 Jan 2009 09:43

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
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor HC908 » 09 Jan 2009 10:08

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
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor Djalma Toledo Rodrigues » 09 Jan 2009 11:18

CMD_RCV_SERIAL
void CMD_RCV_SERIAL(void)
Status_CMD_RCV_SERIAL=0;

Ctrl C, Ctrl V
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor HC908 » 09 Jan 2009 11:22

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
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor msamsoniuk » 09 Jan 2009 11:57

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
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor HC908 » 09 Jan 2009 12:01

vou testar mt obg pela força. é isso q eu quero so falta ver se da certo.
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor HC908 » 09 Jan 2009 12:44

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
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor msamsoniuk » 09 Jan 2009 12:53

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!
Avatar do usuário
msamsoniuk
Dword
 
Mensagens: 2935
Registrado em: 13 Out 2006 18:04

Mensagempor HC908 » 09 Jan 2009 13:03

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
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55

Mensagempor HC908 » 10 Jan 2009 13:10

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)
{



}
HC908
Byte
 
Mensagens: 248
Registrado em: 26 Mar 2007 09:55


Voltar para PIC

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

cron

x