Array
(
)

ponteiros em delphi

Piaum3
   - 20 set 2004

como eu faço para declarar e utilizar ponteiros em delphi,caso alguém tenha um material legal que possa me envia piaum3@yahoo.com.br caso queira respostar e postar no fórum pode ser também.

sem mais


Nildo
   - 20 set 2004

Isso é um assunto muito longo. Eu acho melhor você nos dizer sua necessidade para que possamos ajudá-lo.


Bruno Belchior
   - 20 set 2004

amigo como o colega acima disse é um assunto complexo e com pouca utilizada na prática no mundo ´Delphi´ é mais ultilizado por C e C++, mas só uma prévia a decalaração é da mesma forma que uma variável porém prescedida do símbolo ^ ex: var i:^integer; ele cria um ponteiro de inteiro para trabalhar com sua posição na memóra basta trabalhar simplesmente com o i, mas para acessar o conteúdo dele (variável Dinâmica) ultiliza-se o nome da variável (no caso i) e depois o mesmo símbolo ^, ex.: Edit1.Text := IntToStr(^i); se interessar me mande seu e-mail q te mando um trabalho de Faculdade meu sobre o assunto totalmente feito em Delphi, mas como já disse p/ Delphi não vejo necessidade de ponteiro (salvo casos extremos)... espero ter ajudado.


Bruno Belchior
   - 20 set 2004

amigo como o colega acima disse é um assunto complexo e com pouca utilizada na prática no mundo ´Delphi´ é mais ultilizado por C e C++, mas só uma prévia a decalaração é da mesma forma que uma variável porém prescedida do símbolo ^ ex: var i:^integer; ele cria um ponteiro de inteiro para trabalhar com sua posição na memóra basta trabalhar simplesmente com o i, mas para acessar o conteúdo dele (variável Dinâmica) ultiliza-se o nome da variável (no caso i) e depois o mesmo símbolo ^, ex.: Edit1.Text := IntToStr(^i); se interessar me mande seu e-mail q te mando um trabalho de Faculdade meu sobre o assunto totalmente feito em Delphi, mas como já disse p/ Delphi não vejo necessidade de ponteiro (salvo casos extremos)... espero ter ajudado.


Nildo
   - 20 set 2004

Normalmente você usa esse indicador ^ para fazer acesso direto a memória. Por exemplo:

#Código


var
num: ^Integer;
begin
Num := Pointer( $bbbbbbbb );
ShowMessage( IntToStr( Num^ ) );
end;


Você está falando atribuindo o NUM como sendo o ponteiro da memória localizada em 0xBBBBBBBB . Toda vez que você ler esse Num^ ele vai te retornar o que há exatamente naquela localidade. E quando você for escrever algo neste local de memória, você escreve atribuindo valor ao Num^.


S
   - 20 set 2004

Para declarar um ponteiro é simples:

identificador:^tipo;

Exemplos:

Codigo:^Integer;
Nome:^String;

Antes de usar o ponteiro você tem que armazenar memória para ele, use o seguinte comando:

New(identificador);
ou
GetMen(identicicador,memória);

E para liberar a memória do ponteiro use o seguinte comando:

Dispose(identificador);
ou
FreeMen(identificador,memória);

Nota:o parâmetro mémoria é um integer que indica a memória em bytes a ser alocada ou liberada.

Nunca atribua um valor ao ponteiro e sim para o valor que ele aponta:

Exemplo:
Codigo:^Integer;
begin
Codigo:=1; //Errado
Codigo^:=1; //Certo

Para obter um valor de uma variável use o seguinte comando:

identificador:=@variavel;

Exemplo:
Codigo:^Integer;
Valor:Integer;
begin
Codigo:=@Valor;


Christian_adriano
   - 10 abr 2005

Olá Amigo ´S´,

vc pode me dá uma mão, é o seguinte, gostaria de ´Percorrer´ todo o ponteiro. Vc sabe como fazer isso ?

Em baixo vou coloca parte do meu código.

Obs. Estou usando o Pascal (Turbo Pascal).

-------------------------------------------------------------------------------------
type
{ fifo }
Apontador = ^Estados;
Estados = record
Chave: Integer;
NomeEstado: String;
Proximo: Apontador ;
end;
{ lifo }
Apont = ^Nodo;
Nodo = record
Chave: Integer;
NomeCidade: String;
Seguinte: Apont;
end ;

{ Variaveis Globais }
var

Primeiro, Ultimo: Apontador ; { controla lifo - cidades }
Topo: Apont; { controla fifo - estados}

procedure varrerLitas;
var
ptaux, Inicio : apontador ; {fifo}
ptaux2 : Apont ; {lifo}
begin

if (ultimo = nil) and (Topo = nil) then
Exit;

ptaux := Ultimo;
ptaux2 := Topo;

ClrScr; { limpa a tela }

WriteLn(´Listagem: ´);
WriteLn(´´);

{ Lista os Estados }
while (ptaux <> Primeiro) do
begin
Write(´Estado: ´, ptaux^.nomeestado);
WriteLn(´´);
{ Lista os Municipios de cada Estado }
while (ptaux^.Chave = ptaux2^.Chave) do
begin
write(´ Municipio: ´, ptaux2^.NomeCidade);
WriteLn(´´);
Prior(ptaux2); {volta ponteiro de Municipios ******** AKI}
end;

Prior(ptaux); {volta ponteiro de Estados - AKI TB}
end;

end;
------------------------------------------------------------------------------------
Desde já agradeço atenção.

[]´s

Christian.


Beppe
   - 10 abr 2005

Vc quer a implementação de ´Prior´? Seguir o próximo elemento é simples.

#Código

procedure Prior(var Nodo: PListaEncadeada);
begin
if Nodo <> nil then
Nodo := Nodo^.Proximo;
end;



Isabelct
   - 11 abr 2005

Olá,

Tem um tutorial sobre ponteiros no endereço http://joaomorais.com.br/pascal/push.php?download=58594639. Aqui você vai conhecer tudo o que precisa saber sobre o funcionamento dos ponteiros.


Christian_adriano
   - 11 abr 2005

Olá colega ´Beep´, naum deu muito certo...
vou colocar uma parte do meu código pra c analisar se tah certo.

--------------------------------------------------------------------------------------
{ ***********/ Varrer Listas \***************}
procedure varrerListas;
var
ptaux : apontador ; {fifo}
ptaux2 : Apont ; {lifo}
begin

if (ultimo = nil) and (Topo = nil) then
Exit;

ptaux := Ultimo;
ptaux2 := Topo;

ClrScr; { limpa a tela }

WriteLn(´ >>>>>> Listagem <<<<<<< ´);
WriteLn(´´);

{ Lista os Estados }
while (ptaux <> Primeiro) do
begin
Write(´ -> Estado: ´, ptaux^.nomeestado);
WriteLn(´´);
{ Lista os Municipios de cada Estado }
while (ptaux^.Chave = ptaux2^.Chave) do
begin
write(´ -> Municipio: ´, ptaux2^.NomeCidade);
WriteLn(´´);
ptaux2 := ptaux2^.Seguinte; {volta ponteiro de Municipios}
end;

ptaux := ptaux^.Proximo; {volta ponteiro de Estados}
end;

ReadKey; { Pause }

end;
--------------------------------------------------------------------------------------

Grato.

[]´s.

Christian.


Beppe
   - 11 abr 2005

Pelo que eu percebi, Ultimo(uma fifo) aponta para uma lista de estados e Topo(uma lifo) é uma lista de cidades. Vc precisa separar as cidades por estado, correto?

Primeiro, vc naum fez a checagem certa para o caso de uma das listas ser nula(vc checa, mas naum fez certo...)

Segundo, no loop interno(sobre as cidades), vc naum está checando por nil. Existe um sentinela ou algo do tipo?


Christian_adriano
   - 11 abr 2005

Olá ´Beppe´,

Então como vc me sugeria para a implementação ?


Grato.


Christian.


Beppe
   - 11 abr 2005

Oi.

Eu sigo a política de não resolver trabalho de faculdade de terceiros. :wink:

Esforce-se um pouquinho e entenda a matéria. Se precisar visite o link que a Isabel te passou. :wink:


Marioguedes
   - 11 abr 2005

Sugiro o Livro: Algoritimos e Estruturas de Dados com Delphi de Julian Bucknall