Página 1 de 2
Porque no CCS não aceita isso?

Enviado:
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);
}

Enviado:
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.

Enviado:
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.

Enviado:
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

Enviado:
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

Enviado:
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

Enviado:
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?

Enviado:
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.

Enviado:
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?

Enviado:
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?

Enviado:
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?

Enviado:
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

Enviado:
05 Nov 2007 14:08
por ze
apaguei...
abraço...
Re: Porque no CCS não aceita isso?

Enviado:
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.....!!!!

Enviado:
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