BlackTDN Search

quarta-feira, 21 de janeiro de 2009

Protheus :: Programação Básica em Advpl “Combo XXXIV”

Arrays como Parâmetro:

Ao escrever uma função nós a definimos em termos de parâmetros. Chamamos esses parâmetros de Parâmetros Formais da função. Quando chamamos a função, fornecemos os parâmetros que denominamos Parâmetros Reais.

Quando passamos um Array como parâmetro, o Advpl faz o parâmetro formal apontar para o mesmo local indicado pelo parâmetro real. Dessa forma, poderemos mudar os elementos do Array fazendo atribuições a seus parâmetros.

Se o parâmetro real tiver um escopo Public ou Private, ele ficará também visível dentro da rotina chamada. Portanto, poderemos usar o operador == para verificar se eles realmente apontam para o mesmo array. Exemplo:

Private aNomes := { “P.A.Cabral” , “Santos Dumont” }

Test( aNomes )

Function Test( aFormal )
Return( aFormal == aNomes ) //.T.(apenas porque se referem ao //mesmo ponteiro)



Podemos, concluir, a partir disto, que os array são passados por referência;
acima de tudo, podemos mudar seus elementos. Entretanto, precisamos distinguir entre a própria variável array e os elementos a que ela se refere. Ao passar um array, como demonstrado, estamos passando uma referência aos elementos do array; conseqüentemente, a rotina receptora poderá alterá-los por meio de referência. Entretanto, ela pode mudar a própria referência? Ela pode fazer a referência apontar para outra array?

Examinemos o seguinte fragmento de programa:

Local aNomes := { “P.A.Cabral” , “Santos Dumont” }

U_Test( aNomes )

Alert( aNomes[1] ) // P.A.Cabral

User Function Test( aFormal )

Alert( aFormal[1] ) // P.A.Cabral

aFormal := { “Einstein” , “Leibiniz” }

Return( NIL )

A função U_Test() atribui seu parâmetro formal, aFormal, a um novo Array, mas isto não afeta o que aNomes indica. Ela simplesmente cria um novo Array e faz aFormal apontar para ele; aNomes permanece inalterado. É como se tivéssemos atribuído um tipo de dado diferente a aFormal – aNomes continua inalterado no retorno.

Disso podemos concluir que os Arrays são passados por valor! Não podemos mudar o parâmetro. Parece confuso mas: a variável array é passada por valor. Isto significa que não podemos mudar “aquilo para o qual ela estiver apontando”. Entretanto, como as variáveis de arrays são simples referências para os arrays, podemos mudar o conteúdo dos elementos do array, uma vez que sua rotina recebe uma referência a eles.

Nenhum comentário:

Postar um comentário