Passar por referencia ?'@' como isso funciona?
Moderador: Moderadores
Passar por referencia ?'@' como isso funciona?
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
sou iniciante linguagem harbour..
exemplo :
nFuncao := QualQuerCoisa(@nValor)
----------
esse @ q eu nao entendo
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Passar por referencia ?'@' como isso funciona?
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.
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.
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.
Passar por referencia ?'@' como isso funciona?
mas entao quando eu passo sem o '@' nao o pega o valor ?
parece mesma coisa...
parece mesma coisa...
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Passar por referencia ?'@' como isso funciona?
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
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.
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.
- Jairo Maia
- Moderador
- Mensagens: 2785
- Registrado em: 16 Ago 2010 13:46
- Localização: Campinas-SP
Passar por referencia ?'@' como isso funciona?
Olá Mateus,
Vou tentar exemplificar tudo que o colega Pablo já disse. Talvez isso ajude sua compreensão. Veja:
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 NilAbraç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)
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

- Mensagens: 250
- Registrado em: 24 Out 2008 17:02
- Localização: Itaocara - RJ - Brasil
Passar por referencia ?'@' como isso funciona?
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

Rca Sistemas - Itaocara - RJ
Passar por referencia ?'@' como isso funciona?
Seguindo a mesma lógica do exemplo do Jairo, pq no exemplo abaixo as variaveis não mudam de valor?
Faltou algo?
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
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Passar por referencia ?'@' como isso funciona?
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:
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)
Alexandre Santos (AlxSts)
Passar por referencia ?'@' como isso funciona?
Ah ta!
Esqueci de passar os parâmetros!
Vlw
Janio
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
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
