Ir ao conteúdo
  • Cadastre-se

Erro ao utilizar ponteiro


Visitante: Bly

Posts recomendados

Visitante: Bly
 

Olá a todos,

utilizo o delphi 5 e estou com um problema para trabalhar com ponteiro, agradeço desde já qualquer ajuda, segue abaixo o exemplo:

Digamos que eu tenha um array de bytes com os valores abaixo:

buffercom : array [1..53] of byte = (1,2,3,4,5,49,48,48,48, 49,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0,

0,

1,0,

10,0,

0,0,

0,1,

0,0,

15,0,

0,0,

100,0,

20,0,

0,0,

1,

5,0,

48,48,48,48);

tenho tambem uma variável "ponteiro":

pont: ^Tprotocolom;

onde Tprotocolom é:

Tprotocolom = record

protocolo : array[1..5]of byte;

temperatura1 : array[1..4]of byte;

receita_atual : array[1..16]of byte;

st_receita : byte;

passo_atual : word;

tempo_transbordo : word;

tempo_movimento : word;

litros_atual : word;

peso_lote : word;

tempo_adicao_Tq2 : word;

litros_transbordo: word;

tempo_dreno : word;

ponteiro_execucao: word;

temperatura_prog : word;

evento_atual : byte;

litros_prog : word;

nivel_tanque2 : array[1..4]of byte;

end;

Em certo ponto do programa eu digo que : "pont=@buffercom" com isso eu tenho todos os valores de buffercom acessando através da estrutura da variavel "pont" : pont^.protocolo, pont^.temperatura1, etc...

O problema é que as últimas duas variáveis da estrutura não estão com os valores corretos. litros_prog deveria conter o valor "5" e nivel_tanque2 o valor "48,48,48,48", porém o que acontece é que o delphi ignora os valores (5,0) da variável litros_prog e atribui a ela o valor (0,48).

agradeço qualquer ajuda,

obrigado.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Olá a todos,

utilizo o delphi 5 e estou com um problema para trabalhar com ponteiro, agradeço desde já qualquer ajuda, segue abaixo o exemplo:

Digamos que eu tenha um array de bytes com os valores abaixo:

buffercom : array [1..53] of byte = (1,2,3,4,5,49,48,48,48, 49,48,48,48,48,48,48,48,48,48,48,48,48,48,48,0,

0,

1,0,

10,0,

0,0,

0,1,

0,0,

15,0,

0,0,

100,0,

20,0,

0,0,

1,

5,0,

48,48,48,48);

tenho tambem uma variável "ponteiro":

pont: ^Tprotocolom;

onde Tprotocolom é:

Tprotocolom = record

protocolo : array[1..5]of byte;

temperatura1 : array[1..4]of byte;

receita_atual : array[1..16]of byte;

st_receita : byte;

passo_atual : word;

tempo_transbordo : word;

tempo_movimento : word;

litros_atual : word;

peso_lote : word;

tempo_adicao_Tq2 : word;

litros_transbordo: word;

tempo_dreno : word;

ponteiro_execucao: word;

temperatura_prog : word;

evento_atual : byte;

litros_prog : word;

nivel_tanque2 : array[1..4]of byte;

end;

Em certo ponto do programa eu digo que : "pont=@buffercom" com isso eu tenho todos os valores de buffercom acessando através da estrutura da variavel "pont" : pont^.protocolo, pont^.temperatura1, etc...

O problema é que as últimas duas variáveis da estrutura não estão com os valores corretos. litros_prog deveria conter o valor "5" e nivel_tanque2 o valor "48,48,48,48", porém o que acontece é que o delphi ignora os valores (5,0) da variável litros_prog e atribui a ela o valor (0,48).

agradeço qualquer ajuda,

obrigado.

Olá,

Implementei um código a partir do que você postou, fiz uns teste aqui e tirei as seguintes conclusões.

1) Existem mais números no vetor no "buffercom" que no "Tprotocolom" (53 x 42), mas não vejo problema em relação a isso... (vai só usar os 42 primeiros)

2) Eu acho que o erro está na questão dos tipos, no "buffercom" você trabalha com "byte" e no "Tprotocolom" tem variáveis com "word", o que, na minha opinião está causando um conflito de tipo, mesmo sabendo-se que "word" engloba um "byte" o pascal está gerando algum erro. Eu fiz um outro teste só usando "byte" e o programa funcionou corretamente.

Abaixo os meus testes:

LEGENDA: numero da linha - valor do campo - valor no buffer.

CÓDIGO COM BYTE E WORD (modelo proposto por você)


CRT;

CONST
buffercom : array [1..53] of byte = (1,2,3,4,5,49,48,48,48,49,48,48,48,48,
48,48,48,48,48,48,48,48,48,48,0,0,1,0,
10,0,0,0,0,1,0,0,15,0,0,0,100,0,20,0,0,
0,1,5,0,48,48,48,48);
TYPE
Tprotocolom = record
protocolo : array[1..5]of byte;
temperatura1 : array[1..4]of byte;
receita_atual : array[1..16]of byte;
st_receita : byte;
passo_atual : word;
tempo_transbordo : word;
tempo_movimento : word;
litros_atual : word;
peso_lote : word;
tempo_adicao_Tq2 : word;
litros_transbordo: word;
tempo_dreno : word;
ponteiro_execucao: word;
temperatura_prog : word;
evento_atual : byte;
litros_prog : word;
nivel_tanque2 : array[1..4]of byte;
end;

VAR
pont : ^Tprotocolom;

{incrementado por Simon Viegas}
VAR
i,j : byte;
BEGIN
clrscr;
pont:=@buffercom;

for i:=1 to 5 do
writeln(' ',i,' protocolo[',i,']=',pont^.protocolo[i],' buf=',buffercom[i]);
j:=i;
for i:=1 to 4 do
writeln(' ',j+i,' temperatura1[',i,']=',pont^.temperatura1[i],' buf=',buffercom[j+i]);
readln;
j:=j+i;
for i:=1 to 16 do
writeln(' ',j+i,' receita_atual[',i,']=',pont^.receita_atual[i],' buf=',buffercom[j+i]);
j:=j+i+1;
writeln(' ',j,' st_receita=',pont^.st_receita,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' passo_atual=',pont^.passo_atual,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_transbordo=',pont^.tempo_transbordo,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_movimento=',pont^.tempo_movimento,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' litros_atual=',pont^.litros_atual,' buf=',buffercom[j]);
inc(j);
readln;
writeln(' ',j,' peso_lote=',pont^.peso_lote,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_adicao_Tq2=',pont^.tempo_adicao_Tq2,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' litros_transbordo=',pont^.litros_transbordo,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_dreno=',pont^.tempo_dreno,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' ponteiro_execucao=',pont^.ponteiro_execucao,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' temperatura_prog=',pont^.temperatura_prog,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' evento_atual=',pont^.evento_atual,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' pont^.litros_prog=',pont^.litros_prog,' buf=',buffercom[j]);
inc(j);
for i:=1 to 4 do
writeln(' ',j+i-1,' pont^.nivel_tanque2[',i,']=',pont^.nivel_tanque2[i],' buf=',buffercom[j+i-1]);
readln;
end.
USES

CÓDIGO SÓ COM BYTES (com word deu o mesmo resultado)


CRT;

CONST
buffercom : array [1..53] of byte = (1,2,3,4,5,49,48,48,48,49,48,48,48,48,
48,48,48,48,48,48,48,48,48,48,0,0,1,0,
10,0,0,0,0,1,0,0,15,0,0,0,100,0,20,0,0,
0,1,5,0,48,48,48,48);
TYPE
Tprotocolom = record
protocolo : array [1..5] of byte;
temperatura1 : array [1..4] of byte;
receita_atual : array [1..16] of byte;
st_receita : byte;
passo_atual : byte;
tempo_transbordo : byte;
tempo_movimento : byte;
litros_atual : byte;
peso_lote : byte;
tempo_adicao_Tq2 : byte;
litros_transbordo : byte;
tempo_dreno : byte;
ponteiro_execucao : byte;
temperatura_prog : byte;
evento_atual : byte;
litros_prog : byte;
nivel_tanque2 : array [1..4] of byte;
end;

VAR
pont : ^Tprotocolom;

{incrementado por Simon Viegas}
VAR
i,j : byte;
BEGIN
clrscr;
pont:=@buffercom;

for i:=1 to 5 do
writeln(' ',i,' protocolo[',i,']=',pont^.protocolo[i],' buf=',buffercom[i]);
j:=i;
for i:=1 to 4 do
writeln(' ',j+i,' temperatura1[',i,']=',pont^.temperatura1[i],' buf=',buffercom[j+i]);
readln;
j:=j+i;
for i:=1 to 16 do
writeln(' ',j+i,' receita_atual[',i,']=',pont^.receita_atual[i],' buf=',buffercom[j+i]);
j:=j+i+1;
writeln(' ',j,' st_receita=',pont^.st_receita,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' passo_atual=',pont^.passo_atual,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_transbordo=',pont^.tempo_transbordo,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_movimento=',pont^.tempo_movimento,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' litros_atual=',pont^.litros_atual,' buf=',buffercom[j]);
inc(j);
readln;
writeln(' ',j,' peso_lote=',pont^.peso_lote,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_adicao_Tq2=',pont^.tempo_adicao_Tq2,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' litros_transbordo=',pont^.litros_transbordo,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' tempo_dreno=',pont^.tempo_dreno,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' ponteiro_execucao=',pont^.ponteiro_execucao,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' temperatura_prog=',pont^.temperatura_prog,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' evento_atual=',pont^.evento_atual,' buf=',buffercom[j]);
inc(j);
writeln(' ',j,' pont^.litros_prog=',pont^.litros_prog,' buf=',buffercom[j]);
inc(j);
for i:=1 to 4 do
writeln(' ',j+i-1,' pont^.nivel_tanque2[',i,']=',pont^.nivel_tanque2[i],' buf=',buffercom[j+i-1]);
readln;
end.
USES

Essa questão do "i" e "j" está um pouco confusa, mas é basicamente que o mesmo "número da linha" (observe que está correto) vai para o vetor "buffercom", o que demonstrará a correspondência entre o "buffercom" x "Tprotocolom".

Em fim, eu acho que basta usar só um tipo (byte ou word) que seu problema será resolvido.

Qualquer dúvida ou comentário é só postar.

Abraços

UPDATE

Só uma pequena dica: para substituir qualquer palavra em algum código, basta utilizar do recurso "substituir" ou "replace" (vai depender do editor), daí coloca a palavra que deverá ser alterada pela a nova e optar por "substituir todas" ou "change all" ou algo parecido.

Digo isso para facilitar, caso você não conhecesse esse recuros, e precise alterar o seu código... é uma coisa simples, mas quebra um galho danado!!! :)

Abraços

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...