Página 1 de 1

De volta ao "C"

MensagemEnviado: 17 Jul 2008 23:23
por brasilma
Desculpem minha "gonorância", estou tentando fazer um or entre uma contante e uma variável local e atribuir o resultado a uma variável Global, porem o compilador está apresentando a linha de erro abaixo, alguém pode me dizer porque?


../AVRGLCD.c:212: error: expected expression before '=' token


#define GLCD_X_ADDR = 0xB8

void glcd_data (uint8_t);

void GLCD_CLEAR (void)
{
uint8_t base_X;
uint8_t base_Y;

glcd_data = GLCD_X_ADDR || base_X; << erro

}

Abraços.

MensagemEnviado: 18 Jul 2008 01:59
por lucaszampar
é operação lógica bit a bit?

tenta:
glcd_data = (GLCD_X_ADDR | base_X)

MensagemEnviado: 18 Jul 2008 07:43
por barboza
Brasilma!

glcd_data é uma função que recebe um parâmetro e não uma variável global.
E como o amigo disse, or bit a bit é |, se for operação lógica ||.

Neste caso seria:

glcd_data(GLCD_X_ADDR | base_X);



Agora se era pra ser uma variável global, a declaração esta errada.

void glcd_data (uint8_t);
para
uint8_t glcd_data;

MensagemEnviado: 18 Jul 2008 08:13
por brasilma
Obrigado pela ajuda Lucas e Barboza, sei que é simples para vocês, mas estou aprendendo muito.

Com uma bobeirinha destas aprendi várias coisas.

Com mais testes agora cedo, descobri que o que está causando o problema é a constante "GLCD_X_ADDR", se fizer a operação com outra variável qualquer (com ou sem parenteses) compila sem problemas.

Vou fazer mais algumas experiências, procurar uns exemplos e assim que resolver volto aqui.

Grande Abraço.

MensagemEnviado: 18 Jul 2008 08:39
por barboza
Oi Brasilma,

Vendo novamente seu post e o comentario do problema com a constante, vi que ela foi declarada errada também.

#define GLCD_X_ADDR = 0xB8

Não tem o sinal de igual.


#define GLCD_X_ADDR (0xB8)

MensagemEnviado: 18 Jul 2008 08:53
por xultz
Eu achei esquisito isso:
glcd_data = GLCD_X_ADDR || base_X; << erro

Não seria algo do tipo
glcd_data = (GLCD_X_ADDR || base_X) << erro;

MensagemEnviado: 18 Jul 2008 09:06
por brasilma
Olá Xultz,

Para mim que está começando tudo é esquisito, rs, rs

Porem o compilador aceita com ou sem os parenteses (isto não significa que ele irá executar o que imagino que ele deveria fazer, mas pelo menos erro não dá, rs, rs :D ).

O erro ocorre por causa da constante que estou incluindo na operação GLCD_X_ADDR.

Abraços.

MensagemEnviado: 18 Jul 2008 12:56
por Maurício
Salve, brasilma!

As dicas estão corretas. Ponto e vírgula finaliza um comando no C, então, se a sua expressão tem que deslocar bits pra esquerda, a codificação que o xultz citou é a correta. Se bem que, dependendo das precedências, talvez nem os parênteses sejam necessários. Precisa ver o mapa de precedências.

Seu problema maior é como o barboza citou, sinal de igualdade no DEFINE.

O correto é como ele citou ou então, não precisa nem dos parênteses:

Código: Selecionar todos
#define GLCD_X_ADDR 0xB8


É só tirar o sinal de igual. O espaço em branco, entre a macro e a atribuição, é que define o valor da macro.

Vendo agora, tem mais alguns problemas tb, ehehehehehee

Código: Selecionar todos
#define GLCD_X_ADDR = 0xB8

void glcd_data (uint8_t);  // AQUI VC DEFINE UM PARÂMETRO DE ENTRADA, MAS, NÃO ESPECIFA O NOME DA VARIÁVEL!

void GLCD_CLEAR (void)
{
uint8_t base_X;
uint8_t base_Y;

glcd_data = GLCD_X_ADDR || base_X; << erro

}


E, afinal, glcd_data é uma variável ou é uma função?
Se for uma função, vai devolver algum dado?

Se glcd_data for uma variável, a declaração poderia ser:

Código: Selecionar todos
unsigned char glcd_data;


Quem é a variável global? Diz aí!

Se vc for fazer uma função pra calcular esse parâmetro, e ele for usado em somente um processo, o melhor a fazer é uma função que devolva esse parâmetro, não usar uma variável global.
Vc usa somente dentro da função que utiliza o dado, e depois da função executada, a memória usada é liberada.

[]'s

Re: De volta ao "C"

MensagemEnviado: 18 Jul 2008 13:12
por Maurício
brasilma escreveu:
Código: Selecionar todos
glcd_data = GLCD_X_ADDR || base_X;  << erro


Ah! Agora que eu entendí!
Isso daí é pra marcar o lugar em que está dando erro, não é isso? ehehehehehehe

Quando for assim, coloca dupla barra antes, pra gente saber que a partir dalí é um comentário!!! kkkkkkkkkkkkkkkkkk

Código: Selecionar todos
glcd_data = GLCD_X_ADDR || base_X;  // << erro


Esquece do assembler, cara! Mudou a filosofia! ehehehehehehehe
Pra bem melhor!

[]'s

MensagemEnviado: 18 Jul 2008 13:27
por xultz
Aaaaaaaaaaaaaaaaaaaaaahhh!!! Agora sim! :)

MensagemEnviado: 18 Jul 2008 15:20
por Jorge_Francisco
Mas no lugar de || não deveria ser |?

MensagemEnviado: 18 Jul 2008 22:06
por Maurício
E o Jorge está certo!

No lugar de dupla barra, pra fazer a operação OR, é uma barra só!

[]'s