Passar por referencia ?'@' como isso funciona?

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

mateus301
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 24 Mar 2012 12:47
Localização: marialva/pr

Passar por referencia ?'@' como isso funciona?

Mensagem por mateus301 »

alguem poderia me explicar como isso funciona isso de passar uma variavel por referencia ?
sou iniciante linguagem harbour..

exemplo :

nFuncao := QualQuerCoisa(@nValor)
----------
esse @ q eu nao entendo
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Passar por referencia ?'@' como isso funciona?

Mensagem por Pablo César »

Oi Mateus, bem vindo ao fórum !

A passagem por referência não é típico somente do Harbour, praticamente todas as linguagens advindas da linguagem C possuem esse recurso. Aliás praticamente todas que seja do tipo procedural.

Quando você passa um parâmetro através de um chamado de função, a função pode receber esta informação como argumento atribuindo a uma variável, ocupando um segundo espaço de memória. Mas quando o fazemos por referência, com "@" indicamos que a variável já existe e internamente pega o endereço de memória daquela variável. E quando se altera, dentro da função ou procedimento, o valor de uma variável passada por referência esta alteração surte efeito em todo o programa.

No seu exemplo a variável nValor já existe e o arroba é pra indicar ao processador para assumir o conteúdo que está no endereço que ocupa a variável nValor.
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
mateus301
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 24 Mar 2012 12:47
Localização: marialva/pr

Passar por referencia ?'@' como isso funciona?

Mensagem por mateus301 »

mas entao quando eu passo sem o '@' nao o pega o valor ?

parece mesma coisa...
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Passar por referencia ?'@' como isso funciona?

Mensagem por Pablo César »

Quando você passa sem o "@" na verdade está passando o valor da própria variável e fazendo uma cópia. E com "@" você está indicando o endereço na memória daquela variável, isto é, vai pega o mesmo objeto, vai pegar o conteúdo na memoria diretamente. Vem a utilizar o mesmo conteúdo, só que com passagem por referência você não criar outra variável com o mesmo valor. Imagine que a variável tenho um conteúdo extenso, isso ocuparia espaço na memória desnecessariamente.

Quando se passa um parâmetro por valor estamos realmente passando o valor ou a cópia de um valor armazenado em uma variável ou propriedade de um componente. Quando a passagem se faz por referência, estamos passando o endereço de memória da variável e não o seu valor.

Olha conceito no Wikipedia e como sucede em outras linguagens: http://pt.wikipedia.org/wiki/Ponteiro_( ... .A7.C3.A3o
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

Passar por referencia ?'@' como isso funciona?

Mensagem por Jairo Maia »

Olá Mateus,

Vou tentar exemplificar tudo que o colega Pablo já disse. Talvez isso ajude sua compreensão. Veja:

Código: Selecionar todos

Function Main()
 Local nValor1 := 100, nValor2 := 300
 
 Calcular( nValor1, @nValor2 )  // ambas enviadas a função Calcular(). Apenas a Valor2 por referência.

 /*
  Veja que ambas variaveis foram declaradas Local, assim, somente esta função as vê, porém, ao passar por referência, como ela sofreu alteração na função Calcular(), seu valor passa a ser 700 também aqui, porque foi somado o valor da varialvel 1 na função Calcular.
 */

 ? nValor1  // não passada por referência, permanece 100
 ? nValor2  // passada por referência, assumiu a alteração efetuada na função Calcular(). Seu valor agora: 700

Return Nil

Function Calcular( nValor1, nValor2 )
 nValor1 += nValor2  // novo valor de nValor1 = 400
 nValor2 += nValor1  // novo valor de nValor2 = 700
Return Nil
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

Passar por referencia ?'@' como isso funciona?

Mensagem por sambomb »

Código: Selecionar todos

//-- Alterar mandando por referência
Procedure Teste1()
Local xVar := "A"
   ? xVar //-- "A"
   DefinirB(@xVar)
   ? xVar //-- "B"

Return


Procedure DefinirB(cReferencia)

   cReferencia := "B"

Return nil

//----------------------------------------------------------------//
//-- Alterar se aproveitando do escopo (private)
Procedure Teste2()
Private xVar := "A"

   ? xVar //-- "A"
   SetarB()
   ?xVar //-- "B"

Return 

Procedure SetarB()

   xVar := "B"

Return nil
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Passar por referencia ?'@' como isso funciona?

Mensagem por janio »

Seguindo a mesma lógica do exemplo do Jairo, pq no exemplo abaixo as variaveis não mudam de valor?

Código: Selecionar todos

Function Main()
Local	kArq := 0
Local	oRet := .f.
 
 AtualizandoBD( @kArq, @oRet ) 

 ? kArq
 ? oRet

Return Nil

FUNCTION AtualizandoBD 
oRet = .t.
kArq = 1000

Return Nil
Faltou algo?
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Passar por referencia ?'@' como isso funciona?

Mensagem por alxsts »

Olá!

Não mudam de valor porque, embora você passe por referência os parâmetros para a função AtualizandoBD( @kArq, @oRet ), na declaração da função AtualizandoBD você não declara os parâmetros formais dela.

Veja um exemplo onde elas sofrem alteração:

Código: Selecionar todos

Function Main()
Local kArq := 0
Local oRet := .f.
 
 AtualizandoBD( @kArq, @oRet ) 

 ? kArq
 ? oRet

Return Nil

FUNCTION AtualizandoBD( nVal, lVal )  
lVal := .t.
nVal := 1000

Return Nil
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

Passar por referencia ?'@' como isso funciona?

Mensagem por janio »

Ah ta!

Esqueci de passar os parâmetros!

Vlw

Janio
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Responder