Ir ao conteúdo
  • Cadastre-se
Bly

Erro ao utilizar ponteiro

Recommended Posts

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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×