Página 1 de 1

Passar por referencia ?'@' como isso funciona?

Enviado: 24 Mar 2012 14:22
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

Passar por referencia ?'@' como isso funciona?

Enviado: 24 Mar 2012 14:43
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.

Passar por referencia ?'@' como isso funciona?

Enviado: 24 Mar 2012 14:54
por mateus301
mas entao quando eu passo sem o '@' nao o pega o valor ?

parece mesma coisa...

Passar por referencia ?'@' como isso funciona?

Enviado: 24 Mar 2012 15:03
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

Passar por referencia ?'@' como isso funciona?

Enviado: 26 Mar 2012 09:33
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

Passar por referencia ?'@' como isso funciona?

Enviado: 26 Mar 2012 11:15
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

Passar por referencia ?'@' como isso funciona?

Enviado: 27 Out 2014 22:40
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?

Passar por referencia ?'@' como isso funciona?

Enviado: 27 Out 2014 23:25
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

Passar por referencia ?'@' como isso funciona?

Enviado: 28 Out 2014 01:57
por janio
Ah ta!

Esqueci de passar os parâmetros!

Vlw

Janio