Envio Por Referência ou por Valor:
Um aspecto importante do envio de parâmetros para as funções é se eles são passados por referência ou por valor. O método de envio de um argumento dependerá do método de chamada; ele não pode ser determinado no ponto em que a própria função é definida.
Quando os parâmetros são passados por referência, a função recebe ponteiros para os verdadeiros parâmetros, e quaisquer mudanças que ela introduzir neles serão imediatamente refletidas em seus valores:
User Function Test1()
Local nVar
nVar := 3
U_Test2( @nVar )
//Apos o retorno de U_Test2() nVar terá o conteúdo igual 1
Return( NIL )
User Function Test2( nVar1 )
nVar1 := 1
Return( NIL )
Para efetuarmos a passagem por referência devemos prefixar a variável com o operador de referência @.
Se passarmos um parâmetro por valor, o valor inicializará a variável local ou privada associada com o parâmetro formal, mais quaisquer mudanças introduzidas neste valor pela função desaparecerão. O verdadeiro parâmetro não é alterado pela operação da função.
User Function Test1()
Local nVar
nVar := 3
U_Test2( nVar )
//Apos o retorno de U_Test2() nVar terá o conteúdo igual 3
Return( NIL )
User Function Test2( nVar1 )
nVar1 := 1
Return( NIL )
A chamada a U_Test2( nVar ) determina o envio de parâmetros por valor, pois o operador de referência @ não foi utilizado.
Os campos de banco de dados são exceções. Eles sempre são passados por valor, independentemente do estilo de chamada; caso contrário, toda vez que o parâmetro formal fosse mudado, seria necessário atualizar o banco de dados. Mas isso só é valido se o campo do banco de dados estiver prefixado pelo alias. Exemplo:
dbSelectArea( “SRA” ) //Seleciona a área de trabalho SRA
U_Teste1( @SRA->RA_MAT ) //irá gerar erro durante a compilação
U_Teste1( @RA_MAT ) //irá gerar erro na execução
U_teste1( @_Field->RA_MAT ) //irá gerar erro na execução
SRA->( U_teste1( @RA_MAT ) ) //irá gerar erro na execução
Recomendação: Para que não ocorra erro de execução, sempre prefixe o campo com o alias correspondente para que seja possível identificar se um campo de tabela está sendo passado por referência.
Comentários
Postar um comentário