new...dipose = erro ???
Olá Pessoal....
Estou com o seguinte problema e preciso de ajuda.......
veja o seguinte código...
var buffer : ^Byte;
begin
new (buffer);
..
..
dispose (Buffer);
ao executar o programa, é apontado um erro na linha onde está o comando dispose, com a seguinte mensagem ´Invalid Pointer Operation´
:?: :?: :?:
... bem...coloquei um remark no dispose e o programa roda legal...mas depois de um tempo ele começa a dar erro de falta de ´ resources ´...
Agradeço a ajuda dos colegas..... :roll: :roll:
Estou com o seguinte problema e preciso de ajuda.......
veja o seguinte código...
var buffer : ^Byte;
begin
new (buffer);
..
..
dispose (Buffer);
ao executar o programa, é apontado um erro na linha onde está o comando dispose, com a seguinte mensagem ´Invalid Pointer Operation´
:?: :?: :?:
... bem...coloquei um remark no dispose e o programa roda legal...mas depois de um tempo ele começa a dar erro de falta de ´ resources ´...
Agradeço a ajuda dos colegas..... :roll: :roll:
C#r
Curtidas 0
Respostas
Bacalhau
03/12/2003
Colega o melhor é mostrares o código entre o new e o dispose. Aparentemente o ponteiro está numa situação indefinida.
GOSTEI 0
C#r
03/12/2003
Olá amigo, obrigado pela resposta...
Bem, estou usando o Delphi 4 professional (aquele da CD EXPERT).
desenvolvi um equipamento que monitora 8 canais digitais e 8 canais analógicos em uma unidade remota e em caso de pane ele chama a central (via modem) e passa todos estes parametros de telemetria em tempo real para um computador onde roda este programa em delphi.
Usei ponteiros em diversos pontos do programa, e todos deram o mesmo problema. Por sorte, pude omitir o new, pois estes ponteiros apenas copiavam o endereço de chamada, mas sobrou um que precisa ser inicializado... o código segue abaixo....
procedure TForm1.GetCommand(Comando,Ah,Al,Data : Byte);
var soma : Byte;
ComBuff , // Combuff e ComBuffcopy são usados no RX e TX
ComBuffCopy : ^Byte; // para chamadas das procedures de CommPort.
Const Count = 5; // Todo packet contém 5 bytes
begin
new (ComBuff); // criando as variáveis usadas para passar
// new (ComBuffCopy); // dados para CommPort <== este deu para tirar !
ComBuffCopy := ComBuff; // copy guarda endereço inicial
ComBuff^ := Comando; // Comando
inc (ComBuff); // atualiza vetor
ComBuff^ := Ah; // Endereço alto
inc (ComBuff); // Atualiza vetor
ComBuff^ := Al; // Endereço baixo
inc (ComBuff); // Atualiza vetor
ComBuff^ := Data; // Quantidade a ler
soma := Comando+Ah+Al+Data; // CheckSum
inc (ComBuff); // Atualiza vetor
ComBuff^ := soma; // Checksum no buffer de TX
// ModemMessageBar(´CheckSum:´ + intToStr(soma));
if CommPort.SendData(ComBuffCopy,Count) <> 0 then LedTxOn;
TimeOut_.Enabled := true; //solicita cronômetro TimeOut
//dispose(ComBuff);
end;
Bem, estou usando o Delphi 4 professional (aquele da CD EXPERT).
desenvolvi um equipamento que monitora 8 canais digitais e 8 canais analógicos em uma unidade remota e em caso de pane ele chama a central (via modem) e passa todos estes parametros de telemetria em tempo real para um computador onde roda este programa em delphi.
Usei ponteiros em diversos pontos do programa, e todos deram o mesmo problema. Por sorte, pude omitir o new, pois estes ponteiros apenas copiavam o endereço de chamada, mas sobrou um que precisa ser inicializado... o código segue abaixo....
procedure TForm1.GetCommand(Comando,Ah,Al,Data : Byte);
var soma : Byte;
ComBuff , // Combuff e ComBuffcopy são usados no RX e TX
ComBuffCopy : ^Byte; // para chamadas das procedures de CommPort.
Const Count = 5; // Todo packet contém 5 bytes
begin
new (ComBuff); // criando as variáveis usadas para passar
// new (ComBuffCopy); // dados para CommPort <== este deu para tirar !
ComBuffCopy := ComBuff; // copy guarda endereço inicial
ComBuff^ := Comando; // Comando
inc (ComBuff); // atualiza vetor
ComBuff^ := Ah; // Endereço alto
inc (ComBuff); // Atualiza vetor
ComBuff^ := Al; // Endereço baixo
inc (ComBuff); // Atualiza vetor
ComBuff^ := Data; // Quantidade a ler
soma := Comando+Ah+Al+Data; // CheckSum
inc (ComBuff); // Atualiza vetor
ComBuff^ := soma; // Checksum no buffer de TX
// ModemMessageBar(´CheckSum:´ + intToStr(soma));
if CommPort.SendData(ComBuffCopy,Count) <> 0 then LedTxOn;
TimeOut_.Enabled := true; //solicita cronômetro TimeOut
//dispose(ComBuff);
end;
GOSTEI 0
Marcelo Saviski
03/12/2003
Tente: GetMem(variavel, SizeOf(TipoRealque se quer alocar));
GOSTEI 0
Beppe
03/12/2003
Quando você chama New, ele aloca a quantidade de dados referenciada pelo ponteiro. Chamar com um PByte, você só tem direito a 1 byte, SizeOf(Byte) = 1. (Como o Delphi arredonda alocações para múltiplos de 4, você tem 4 bytes, mas esquece que te disse isso, é segredo).
Dispose espera um ponteiro referenciando o primeiro byte de uma alocação. No seu caso, o ponteiro já esta alguns bytes há frente, então, é claro, corrompe o alocador de memória.
Solução:
1) Declare CommBuf como array[0..$FFFF] of Byte;
2) Aloque via GetMem(CommBuf, Count);
3) Acesse a memória via CommBuf[xxx]. O primeiro índice é zero.
4) A dealocação fica Dispose(CommBuf);
Dispose espera um ponteiro referenciando o primeiro byte de uma alocação. No seu caso, o ponteiro já esta alguns bytes há frente, então, é claro, corrompe o alocador de memória.
Solução:
1) Declare CommBuf como array[0..$FFFF] of Byte;
2) Aloque via GetMem(CommBuf, Count);
3) Acesse a memória via CommBuf[xxx]. O primeiro índice é zero.
4) A dealocação fica Dispose(CommBuf);
GOSTEI 0
Bacalhau
03/12/2003
Pareceu-me que o ataliba chegou ao ponto certo. Como complemento, refiro que o comando
dispose(ComBuff);
liberta o ComBuff, mas deixa o CommBuffCopy numa situação indefinida. Sugiro que antes do dispose(ComBuff) faças
CommBuffCopy := nil;
quanto ao comando
ComBuffCopy := ComBuff; // copy guarda endereço inicial
ele dispensa o New anterior. Tá correcta a eliminação do tal New.
espero ter ajudado
abraço
bacalhau
dispose(ComBuff);
liberta o ComBuff, mas deixa o CommBuffCopy numa situação indefinida. Sugiro que antes do dispose(ComBuff) faças
CommBuffCopy := nil;
quanto ao comando
ComBuffCopy := ComBuff; // copy guarda endereço inicial
ele dispensa o New anterior. Tá correcta a eliminação do tal New.
espero ter ajudado
abraço
bacalhau
GOSTEI 0
Beppe
03/12/2003
Putz, cometi um lapso terrível. Quando re-li minha resposta vi que mandei declarar um array estático, quando queria indicar um tipo ponteiro. Corrija a declaração para CommBuf: PByteArray;
GOSTEI 0
C#r
03/12/2003
caraca....esse pessoal é bom demais.....valeu pessoal, estou muito grato...vou tentar a correção agora mesmo..... VALEEEUUUUU !!!!!!!!
GOSTEI 0
C#r
03/12/2003
Peesoal, fiz o seguinte ......
ComBuff := ComBuffCopy;
Dispose (ComBuff);
ComBuffCopy := Nil;
{ levando em considereção o que o amigo Ataliba afirmou quanto ao index estar adiantado em relação ao endereço inicial, como ComBuffCopy era cópia do endereço inicial...... }
FUNCIONOU LEGAL ........
obrigado pessoal..... :D
ComBuff := ComBuffCopy;
Dispose (ComBuff);
ComBuffCopy := Nil;
{ levando em considereção o que o amigo Ataliba afirmou quanto ao index estar adiantado em relação ao endereço inicial, como ComBuffCopy era cópia do endereço inicial...... }
FUNCIONOU LEGAL ........
obrigado pessoal..... :D
GOSTEI 0
Bacalhau
03/12/2003
:wink:
GOSTEI 0