PONTEIROS E ARRAYS, DÚVDA CRUEL

Software e Hardware para uC PIC

Moderadores: andre_luis, 51, guest2003, Renie

PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor Vonnilmam » 07 Nov 2016 09:52

Amigos, tomei a liberdade de abrir outro post, pois surgiu uma enorme dúvida que esta tirando meu sono.

Estou utilizando o Mikroc e um Pic da vida.

Estou tentando criar uma tabela com 160 nomes (strings) e quero chamar esses nomes através de um indexador comum, até ai tudo bem, vejam o trecho de código abaixo:

{ char a[160][17] = "Manuel", "Ivone",...etc até completar 160};

strcpy (txt, a[w]);
}

Em char a o número 160 representa as posições e o número 17 representa o número de caracteres, por texto maximo escrito.
A variavel w é o indexador que "puxa" na memória os nomes, tipo w=1, vai puxar o texto "MANUEL" e assim sucessivamente.
Funciona do jeito que eu quero, porém tá alocando na RAM e eu quero alocar na FLASH...me ajudem, por favor.

O que eu quero é uma dica de como resolver esse problema, é que o compilador esta alocando posições de memória RAM, e eu queria que fosse alocado posições na memória de programa (FLASH).

Depois de ler bastante e esquentar a cuca, cheguei a essa rotina que funciona legalzinho, ela faz parte de outra rotina que envia os dados para o GLCD.

Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor tcpipchip » 07 Nov 2016 10:09

const ?

declare na frente!
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor Vonnilmam » 07 Nov 2016 10:42

Obrigado pela dica, mas com todo respeito como faço isso "sou novato em C".

const char a[160][17]....

Essa declaração deve ser feita antes do MAIN ou dentro do MAIN?

Dentro do MAIN, dá erro de compilação e fora também...

Obrigado
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor Vonnilmam » 07 Nov 2016 11:10

Andei pesquisando um pouquinha mais, rss

E notei que PONTEIROS são utilizados na memória RAM, já para a ROM não é possivel fazer isso diretamente.
Por isso dá erro quando se utiliza CONST num ponteiro.

Alguem saberia dar uma dica de como criar um BUFFER em RAM, pegando uma certa quantidade, tipo 17 bytes da ROM e gravando isso num BUFFER em RAM?

Agradeço e tenho certeza que essa dica será muito valiosa a muitos colegas...

Obrigado :P
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor andre_luis » 07 Nov 2016 11:24

Na verdade só deveria dar erro se voce fizesse um acesso de escrita, em se tratando de ponteiros o C deveria se abstrair do fato de estar em RAM ou ROM para acesso de leitura.
"Por maior que seja o buraco em que você se encontra, relaxe, porque ainda não há terra em cima."
Avatar do usuário
andre_luis
Dword
 
Mensagens: 5447
Registrado em: 11 Out 2006 18:27
Localização: Brasil - RJ

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor eletroinf » 07 Nov 2016 12:05

Bom,

Em C, as strings são passadas como ponteiros, quando se chama uma função com ela de argumento.
Por exemplo, se eu tenho declarado:
const char myStr[] = "Minha frase de teste";

E em alguma parte do código eu tenho uma chamada para uma função que imprime esta string no display,

glcd_text(myStr);

A função glcd_text() recebe um ponteiro para a string e não a dita cuja propriamente dita.

Em geral, em um uC decente com compilador decente não tem nenhum problema em usar ponteiros para a flash, como disse o André.

Se declarar dentro do main() (seria armazenada na RAM) ela fica escondida do resto do código, embora tu possa passar ela como argumento em uma função que tu chame dentro do main().

Se tu queres usar uma constante, que penso ser o jeito mais usual, tem de declarar antes do local que tu usa a variável como argumento. Melhor explicando, a declaração tem de estar antes de tu usar ela, certo? Senão teu programa ainda não sabe que ela existe. Mas claro, tu pode usar a declaração de protótipo, mas acho melhor ver isso depois, por enquanto declara antes de usar.

Se tu declarar dentro de uma função ela fica "visível" só ali dentro.

Ufa, deu o apagão do dia bem quando eu estava no final da linha acima, mas não perdeu o meu texto! :D
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor Vonnilmam » 07 Nov 2016 12:51

NOOOsa, agora que eu pirei o cabeção...

Por favor dá um exemplo, pro veio von, com base no que uso hoje, só que uso puxando da RAM, dentro de uma função, após o MAIN...

Ela esta após o main

{ char *a[] = "texto1", "texto2", "texto3"};
stricpy(txt, a[x]);
glcd_write_text(txt);
}

Assim tá funcionando, agora, por favor me dá um exemplo fazendo a chamada na ROM, onde coloco o ARRAYs *a e como declaro corretamente com o CONST, dentro ou fora da função ou no inicio antes do MAN, ?


Obrigado,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor eletroinf » 07 Nov 2016 13:00

cpp code
#include <blablabla.h>
#include ....

const char a[] = "texto1", "texto2", "texto3"}; // Não precisa o *, pois sendo uma string será tratada como ponteiro.

glcd_write()
{

}

int main()
{
/* Código da função main */
char txt[sizeof(a)];

stricpy(txt, a[x]); // copia a para txt (Isso é desnecessário, pois...)
glcd_write_text(txt); // escreve txt no lcd (... pode escrever a no lcd diretamente)

}


Deve ser isso, eu escrevi aqui sem testar.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor Vonnilmam » 07 Nov 2016 13:58

Fiz o que você ensinou "eletroinf"...mas dá erro, o texto não é enviado para o buffer TXT.

A variavel TXT é um array com comprimento de 17 bytes, ok.

Eu consegui ler a ROM, fazendo assim, porem ficou complicado, alguém tem uma dica para fazer isso mais enxuto.

Fiz essa agora:

No cabeçalho, antes do MAIN:
const code char *b[3] = {"tex1", "tex2", "nome"};
Dentro do MAIN:
datain = 2;
w[0] = *b[datain];
*b[datain] ++;
w[1] = *b[datain];
*b[datain] ++;
w[2] = *b[datain];
*b[datain] ++;
w[3] = *b[datain];
w[4] = 0;

strcpy (txt, w);
glcd_write_texto(txt);

Pelo que eu entendi, não é possivel (quando se LÊ um string gravado na ROM), jogar ele diretamente num ARRAY em RAM, teria que imprimir através do PONTEIRO * cada letra da STRING...tipo, NOME, *b = 0 lê o dado N, *b= 1 lê o dado O e assim por diante.

Nossa que doideira.

Até o momento notei que a linguagem "C" tem suas vantagens, mas também em alguns casos como NESSE em específico, dá um volta tão grande, tipo uma gambiarra, pois não seria mais simples, executar igualmente se em RAM ou ROM o ponteiro?
Já no assembler é mais facil de entender, essa bagunça...sei lá.
Se alguém puder dar uma idéia de como fazer essa leitura mais amigável, sou mui grato.

Já tô sentindo cheiro de queimado, é minha cuca fervendo...
Obrigado.
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor eletroinf » 07 Nov 2016 14:07

Se dá erro, qual é o erro que dá?

Agora eu vi que tu está com um array de strings.

No momento eu não poder analisar, assim que possível vou dar uma olhada.
"De cada um segundo sua capacidade a cada um segundo sua necessidade."
Avatar do usuário
eletroinf
Word
 
Mensagens: 948
Registrado em: 12 Out 2006 14:59
Localização: Santa Maria - RS

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor Vonnilmam » 07 Nov 2016 15:24

Caro amigo, eletroinf

Eu nem sei mais qual era o erro, sinceramente, minha cuca ferveu tanto...

Parece que quando se coloca o ponteiro dentro do parenteses, junto com o TXT para enviar ao GLCD, dá pau...analizando, verifiquei que quando uma string é alocada na ROM, você tem que lêr uma letra de cada vez...e como a variavel ARRAY TXT possui 17 bytes, dava o erro...não sei porque, não me lembro o código do erro meu amigo.

Agora dessa forma que demonstrei, funcionou belezulras...

Agora vou montar a bagaça da TABELONA...Depois postarei os resultados aqui com maior prazer

Obrigado a todos,
VonNilmam "Assembler" e agora "C"
Avatar do usuário
Vonnilmam
Byte
 
Mensagens: 446
Registrado em: 19 Out 2006 14:25
Localização: espacial

Re: PONTEIROS E ARRAYS, DÚVDA CRUEL

Mensagempor ze » 07 Nov 2016 15:49

A mesma dica do outro post. Penso que com isso vc pode ter algum sucesso
Código: Selecionar todos
const char* dsem[] = "Domingo","Segunda","Terca  ","Quarta ","Quinta ","Sexta  ","Sabado ";//sim vai pra flash

Antes do main(). Teoricamente o limite é sua flash.
Testaí e ver que merdadá...
Avatar do usuário
ze
Dword
 
Mensagens: 1655
Registrado em: 05 Jun 2007 14:32


Voltar para PIC

Quem está online

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

x