new...dipose = erro ???

03/12/2003

0

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:


Responder

Posts

03/12/2003

Bacalhau

Colega o melhor é mostrares o código entre o new e o dispose. Aparentemente o ponteiro está numa situação indefinida.


Responder

03/12/2003

C#r

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;


Responder

03/12/2003

Marcelo Saviski

Tente: GetMem(variavel, SizeOf(TipoRealque se quer alocar));


Responder

03/12/2003

Beppe

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);


Responder

03/12/2003

Bacalhau

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


Responder

03/12/2003

Beppe

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;


Responder

04/12/2003

C#r

caraca....esse pessoal é bom demais.....valeu pessoal, estou muito grato...vou tentar a correção agora mesmo..... VALEEEUUUUU !!!!!!!!


Responder

04/12/2003

C#r

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


Responder

04/12/2003

Bacalhau

:wink:


Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar