Página 1 de 2

Porque no CCS não aceita isso?

MensagemEnviado: 04 Nov 2007 20:38
por HC908
por que ele não aceita isso?
Porque o ponteiro não acessar uma constante, no CCS ?


void mandar_msg(const char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg((char*)"Teste",5);


}

MensagemEnviado: 04 Nov 2007 21:58
por zielpunkt
Ponteiro é uma variável que contém o endereço de uma determinada variável, posicionada na memória, Deus sabe onde. Mas o teu ponteiro sabe onde. Portanto, como uma variável ponteiro poderia ter um valor fixo (constante), seja no CCS ou em qualquer outro compilador C ? (Se eu estiver falando bobagem, podem me escrachar, mas me expliquem porque eu quero aprender).

Quando declara um ponteiro, diferentemente de outras declarações de variáveis, você está informando o tipo de variável para a qual ele vai apontar, mas como ele indica um endereço de memória, o seu "tipo" é conhecido internamente pelo compilador em função do "tamanho" desses endereços para onde vai apontar. Como ele pode apontar para qualquer endereço de memória (em função de como você o utiliza), ele não pode ser uma constante.

Outra coisa: este trecho de código que você postou é meio estranho pra mim. Confesso que não entendi a sua passagem dos parâmetros pra função. Aquele (char*)...Se isso é um ponteiro para uma determinada função(!), não seria (*char)?

Abço.

MensagemEnviado: 04 Nov 2007 23:07
por HC908
Compilo este codigo no compilador da freescale e no da IAR e da certo. ou seja ele guarda a string na flash do dispositivo e imprimir com ajudar da função void mandar _msg(const char *DATA,byte tamanho)
. Agora no CCS não aceita isto. O que eu quero na verdade e guardar a string na flash do dipositivo e com ajuda do ponteiro imprimir esta string.

MensagemEnviado: 04 Nov 2007 23:19
por Maurício
Pode não ser isso, mas, experimenta juntar as palavras que estão separadas pelo sublinhado:

void mandar _msg

por

void mandar_msg

[]'s

MensagemEnviado: 04 Nov 2007 23:30
por HC908
valeu amigo. + não é isso não. o compilador imformar
Attempt to create a pointer to a constant

ou seja o ponteiro não consegue apontar para uma constante

MensagemEnviado: 04 Nov 2007 23:50
por Maurício
É.... lamento!

O Keil aceita esse tipo de codificação, sem problemas.
Vc já experimentou criar uma string e passar a string pra função usando CONST ?

Desse jeito aqui:

char string [ ] = "Teste";

mandar_msg( string, strlen(string));

Se não funcionar, deve realmente ser coisa do CCS.

[]'s

MensagemEnviado: 05 Nov 2007 08:59
por Fábio Pereira
Vou dar o meu pitaco:

A questão real é: PICs são máquinas Harvard e constantes não são armazenadas na RAM e sim na FLASH (que é memória de programa).

O CCS espera que o seu ponteiro aponte para uma área da memória de dados (RAM), o que não é o caso.

A solução seria você escrever algum tipo de função para conversão intermediária ou copiar a sua constante da FLASH para a RAM em tempo de execução.

T+

Re: Porque no CCS não aceita isso?

MensagemEnviado: 05 Nov 2007 09:24
por Rodrigo_P_A
Escreve assim que funciona:

void mandar_msg(char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg("Teste",5);


}

já usei assim, e funciona

cada compilador tem suas particularidades mesmo.

MensagemEnviado: 05 Nov 2007 09:29
por ze
o lance do const tem sentido. veja como envio 1 string para uma display lcd 16x2:
Código: Selecionar todos
void lcd_write(unsigned char c)
{
tlcd=0;//PORTC é usada na int
while(tlcd<2); //garante que aciona display apenas FORA da int

PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
c <<= 4;
PORTC = (PORTC & 0x0f) | (c & 0xf0);
LCD_STROBE;
delay(500);
}
/**********************************************************************/
void msgdsp(unsigned char l,unsigned char c,const char * s)
{
LCD_RS=0;
lcd_write(l+c);  //posiciona cursor
LCD_RS=1;
while(*s)
lcd_write(*s++);
}
Código: Selecionar todos

Re: Porque no CCS não aceita isso?

MensagemEnviado: 05 Nov 2007 09:49
por HC908
Alou rodrigo assim tambem não funcionou. Fiz d ojeito que fabio mandou fazer. eu leio a flash e jogo na ram

[quote="Rodrigo_P_A"]Escreve assim que funciona:

void mandar_msg(char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg("Teste",5);


}

já usei assim, e funciona

cada compilador tem suas particularidades mesmo.[/quote

Re: Porque no CCS não aceita isso?

MensagemEnviado: 05 Nov 2007 12:44
por LeandroPIC
HC908 escreveu:por que ele não aceita isso?
Porque o ponteiro não acessar uma constante, no CCS ?


void mandar_msg(const char *DATA,byte tamanho)
{


}


void main(void)
{

mandar _msg((char*)"Teste",5);


}


Porque CCS não presta!!! hahaha

Descupe não resisti.....

tentei fazer isso no compilador Hitech, e funcinou perfeitamente.


Para que é isso afinal. se for para mandar uma string para a serial ou display use o Printf, esse o CCS aceita.

Re: Porque no CCS não aceita isso?

MensagemEnviado: 05 Nov 2007 14:04
por Maurício
LeandroPIC escreveu:Para que é isso afinal. se for para mandar uma string para a serial ou display use o Printf, esse o CCS aceita.


Porque passar um ponteiro para uma função utilizando o modificador CONST, é a única maneira de garantir que aquela variável não será alterada pela função.

[]'s

MensagemEnviado: 05 Nov 2007 14:08
por ze
apaguei...
abraço...

Re: Porque no CCS não aceita isso?

MensagemEnviado: 06 Nov 2007 11:28
por LeandroPIC
Maurício escreveu:
Porque passar um ponteiro para uma função utilizando o modificador CONST, é a única maneira de garantir que aquela variável não será alterada pela função.

[]'s


Desculpe não entendi.....!!!!

MensagemEnviado: 06 Nov 2007 13:44
por Maurício
Parâmetros passados para uma função em C, são passados por valor, ou seja, C copia o valor dos dados e passa a cópia dos dados para a função.
Estes dados de entrada podem ser alterados pela função mas permanecem inalterados fora dela.

Quando vc passa um ponteiro para uma função, a função pode modificar o conteúdo que o ponteiro aponta. É uma característica do C.
Se vc usa o modificador CONST, como no caso do HC908, vc força a linguagem a NÃO ALTERAR o conteúdo de memória que aquele ponteiro aponta. Vc passa um dado da memória, como se fosse uma constante. Mesmo através de ponteiros.

[]'s