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