Argumento
Antes de continuarmos precisamos saber o significado de parâmetro e
argumento.
É muito comum a confusão entre ambos.
Um argumento é aquilo que se é passado para o parâmetro.
Podemos considerar o parâmetro como uma vaga de estacionamento e o
argumento como um automóvel.
Carros diferentes podem estacionar na vaga em momentos diferentes.
Durante uma chamada pode-se passar um argumento diferente para o mesmo
parâmetro em momentos diferentes.
É comum chamarem argumento de "parâmetro real".
E chamar parâmetro de "parâmetro formal".
Parâmetro 'in'
Comumente argumentos não tem o seu valor alterado dentro das funções.
Seed7 usa a palavra-chave "in" para atender essa situação.
const
func integer: negate (in integer: num1) is
return -num1;
const
func integer: fib (in integer: num1) is func
result
var integer: fib is 1;
begin
if num1 <> 1 and num1 <> 2 then
fib := fib(pred(num1)) + fib(num1 - 2);
end if;
end func;
As funções acima usam 'in' para os parâmetros chamados 'num1'.
Uma atribuição de valor para 'num1' não é permitida.
Parâmetros 'in' se comportam como constantes.
Tentando alterar o valor de um parâmetro 'in'.
const
proc: wrong (in integer: num2) is func
begin
num2 := 0;
end func;
O resultado é um erro em tempo-de-compilação:
***
tst77.sd7(5):52: Variable expected in {num2 := 0 } found parameter (in integer:
num2)
num2 := 0;
Parâmetro 'inout'
Se a função precisar alterar o valor do argumento, use a palavra-chave
"inout".
const
proc: reset (inout integer: num2) is func
begin
num2 := 0;
end func;
Ao chamar a função
reset(number);
A variável number terá o valor 0.
Chamar a função com uma constante ao invés de uma variável
reset(8);
O resultado é um erro em tempo-de-compilação:
***
tst77.sd7(12):52: Variable expected in {8 reset } found constant integer: 8
reset(8);
Parâmetro 'in var'
Podemos também alterar o valor do parâmetro sem alterar o argumento.
Neste caso devemos usar o parâmetro 'in var'.
const
func string: oct_str (in var integer: number) is func
result
var string: stri is "";
begin
if number >= 0 then
repeat;
stri := str(number mod 8) & stri;
number := number mdiv 8;
until number = 0;
end if;
end func;
Parâmetro por valor ou referência
Existem dois tipos de parâmetros:
- Parâmetro por valor
- Parâmetro por referência
"When taking the access right (constant or variable) into account
we get the following table:"
Além dos parâmetros que já conhecemos, a tabela abaixo descreve também
val - chamada por valor
ref - chamada por referência
parameter |
call by |
access right |
val |
value |
const |
ref |
reference |
const |
in |
val / ref |
const |
in var |
value |
var |
inout |
reference |
var |
Se um parâmetro "in" é por referência ou valor, isto
dependerá do seu tipo de dado.
O parâmetro
in
integer: number
É um "parâmetro por valor", também pode ser declarado da
seguinte forma:
val
integer: number
Enquanto o parâmetro
in
string: stri
É um "parâmetro por referência", também pode ser declarado da
seguinte forma:
ref
string: stri
O parâmetro "in" é pré-definido para a maioria dos tipos de
dados.
Geralmente os parâmetros de "tipos de dados" pequenos são por
valor.
Enquanto os "tipos de dados" grandes são por referência.
Na maioria das vezes, não é necessário saber se um parâmetro
"in" é "val" ou "ref".
Em casos raros, um parâmetro "ref" teria efeitos colaterais
indesejáveis com "variáveis globais" ou outros parâmetros "ref".
Nestes casos, um parâmetro explícito "val", ao invéns de
"in" faz sentido.
Em geral, no lugar de parâmetros "in" implícitos, deve-se
optar por parâmetro explícitos, ou seja, "val" ou "ref".
Nenhum comentário:
Postar um comentário