Professor
Brazil
443 Posts Posted - 31/05/2003 : 14:18:37
--------------------------------------------------------------------------------
Estou querendo fazer um ponteiro ciclico para me dar a posição de uma tabela que eu tenho que ler, porém não sei se isso é possível. Gostaria de fazer isso pois tenho vários ponteiros percorrendo esta tabela e tenho que ficar testando todos para saber se a posição atual é igual a ultima posição para então zera-los, o que me consome muito tempo. Gostaria de saber se não tem como quando o ponteiro chegar na ultima posição voltar diretamente para a primeira sem ter que ficar fazendo teste?
Muito obrigado
KrafT
Conselheiro
Brazil
3476 Posts Posted - 31/05/2003 : 14:53:56
--------------------------------------------------------------------------------
Seria isso?
valor=Tabela[Ponteiro];if (Ponteiro++ == LimiteTabela)Ponteiro=0;
Jundiaí
Professor
Brazil
443 Posts Posted - 31/05/2003 : 18:36:12
--------------------------------------------------------------------------------
Isso é o que eu estou fazendo, porém gostaria de saber se existe alguma maneira de retornar a zero sem fazer esta comparação, criando assim um ciclo, como se ele soubesse que após a ultima posição ele deve retornar ao zero. Talvez eu esteja querendo demais hehehe
Obrigado Kraft e a todos.
KrafT
Conselheiro
Brazil
3476 Posts Posted - 31/05/2003 : 18:42:19
--------------------------------------------------------------------------------
Vamos viajar um pouco:
Se tua tabela tiver 256 registros e o ponteiro for de 8 bits sem problema.
Mas se o tamanho da tabela for potencias de 2 (até 2 na 7), vc pode repetilo para encher os 256 registros e ter o mesmo efeito citado acima...
Nossa!!!
Viajei legal...
guest2003
Conselheiro
Brazil
1488 Posts Posted - 02/06/2003 : 00:35:03
--------------------------------------------------------------------------------
Ola Jundiai,
Se sua tabela não variar de tamanho e tiver um tamanho com potencia de 2... (2,4,8,16...256)
Vc pode definir sua variavel utilizando structure... e com o numero de bits necessarios somente... ou seja... se sua tabela tiver 32 pos defina seu ponterio com uma struct de 5 bits... ai quando vc incrementar esta variavel ela automaticamente mudara de 31 para 0 novamente...
[]´s
PS.: Não sei se fui muito claro mas é por ai...
PS2: Vc é de Jundiai ? eu moro em Campinas...
-----
"Nunca ande pelo caminho traçado, pois ele conduz somente até onde os outros já foram." -Alexander Graham Bell
Jundiaí
Professor
Brazil
443 Posts Posted - 02/06/2003 : 07:39:04
--------------------------------------------------------------------------------
Obrigado Guess e Kraft pela valiosa ajuda. Eu moro em Jundiaí sim Guess.
Até+
KrafT
Conselheiro
Brazil
3476 Posts Posted - 02/06/2003 : 21:54:23
--------------------------------------------------------------------------------
quote:
--------------------------------------------------------------------------------
Vc pode definir sua variavel utilizando structure... e com o numero de bits necessarios somente... ou seja... se sua tabela tiver 32 pos defina seu ponterio com uma struct de 5 bits... ai quando vc incrementar esta variavel ela automaticamente mudara de 31 para 0 novamente...
--------------------------------------------------------------------------------
Isso em assembler, iria gerar o mesmo teste que o colega quer evitar...
Ou não?
Jundiaí
Professor
Brazil
443 Posts Posted - 03/06/2003 : 10:30:51
--------------------------------------------------------------------------------
É Kraft também estive pensando nisso e provavelmente á única forma de de ele fazer isto em assembly é com um bit test o que acaba fazendo a comparação também.
Obrigado
Fabio Pereira
Conselheiro
Brazil
2205 Posts Posted - 03/06/2003 : 11:29:16
--------------------------------------------------------------------------------
Olá a todos,
Eu venho acompanhando este tópico há tempo e até agora não entendi:
Jundiaí: qual o problema de se realizar a comparação ???
Uma alternativa para criar este buffer circular que você deseja (desde que com um número de elementos múltiplo de uma potência de 2) poderia ser:
Suponha um buffer circular de 32 elementos, o primeiro começando pelo elemento 0 e como último elemento o 31:
Elemento endereço 0 0x20 1 0x21 2 0x22 ... ... 30 0x3E 31 0x3F
Neste caso, uma forma simples de criar um buffer circular é fazer um AND lógico do número do elemento com a constante 31 (0x3F). Assim, quando o endereço do buffer for maior que 31, por exemplo, 32, teremos: 32 AND 31 = 0, se o índice for 35: 35 AND 31 = 3 e assim por diante.
Uma vez que você tenha realizado esta operação, qualquer que seja o valor utilizado como índice, o resultado será sempre um apontador válido. Em seguida, adicione este resultado ao endereço inicial do buffer (no exemplo acima 0x20) e pronto.
Até +
Fábio Pereira
zemarlon
Conselheiro
Brazil
660 Posts Posted - 06/06/2003 : 17:35:45
--------------------------------------------------------------------------------
Bom, deixa só acrescentar uma informação.
Quando trabalhava com rádio-modem, eu tive esse tipo de problema - a comparacao quando o ponteiro alcancava o final produzia uma forma de onda diferente da desejada.
A maneira que encontrei foi ter DUAS tabelas, uma com os valores que queria e a outra com os indices, dispostos em forma circular. Um exemplo:
tbValores: 22 32 55 22 10
tbIndices: 1 2 3 4 0
Se nao fui muito claro, é só avisar que assim que voltar a acessar o fórum (vai demorar um pouco mas eu volto) eu publico um exemplo em asm ou C.

Abração do Zé.
"É melhor ter um passarinho na mão, do que não ter mão."
\|||/ ( O O )-000---000-