quarta-feira, 18 de dezembro de 2013

18.05.02.05 Parâmetros

 

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