Aula 23: Parâmetros de Procedimentos

Vimos que as procedures e functions utilizam objetos (variáveis, arquivos, etc) locais (declarados em seu corpo) e objetos globais (declarados nos níveis mais externos). Variáveis globais servem para implementar um mecanismo de transmissão de informações de um nível mais externo para um nível mais interno, como o exemplo do fatorial acima. Analogamente, o mesmo mecanismo pode ser usado inversamente para transmitir informações de dentro para fora dos procedimentos, ou seja, quando se altera o conteúdo de uma variável global dentro de um procedimento, a próxima instrução após o término do procedimento terá disponível o valor da última atualização dentro do procedimento.

A utilização de variáveis globais, no entanto, não constitui uma boa prática de programação, visto que podem amarrar os procedimentos (tornando-os dependentes) e quebrar a questão de modularidade. Em um procedimento, as suas variáveis locais tem vida somente durante a sua execução. ou seja, são criadas e alocadas quando no momento da ativação, e liberadas quando de seu término. Além do mais, essas variáveis não podem ser acessadas pelos níveis externos ao procedimento. Então, para transmissão de informações de dentro para fora dos procedimentos a linguagem Pascal utiliza o mecanismo de parâmetros.

Por meio dos parâmetros faz-se a comunicação de fora para dentro e de dentro para fora de um procedimento, o que torna o módulos independentes e reusáveis em outros programas. Os parâmetros são objetos utilizados dentro do procedimento e representam os objetos do nível mais externo (parâmetros de definição). Para declarar procedures e functions que utilizam parâmetros basta acrescentar ao cabeçalho a lista de parâmetros a ser utilizada, que deverá estar entre parênteses. Isso é feito da seguinte forma:

procedure nome(lista-de-parametros);

function nome(lista-de-parametros);

lista-de-parametros é da forma: parâmetro1 : tipo, parâmetro2 : tipo, ..., parâmetron: tipo.

A ativação de um procedimento se faz por meio de uma referência a seu nome seguido pela lista de parâmetros envolvida por parênteses. Esses parâmetros são conhecidos por parâmetros de chamada, e podem ser constantes, variáveis ou expressões dos módulos externos cujos valores serão transmitidos para os parâmetros de definição do procedimento e após a sua execução receberão de volta, ou não, os valores contidos no parâmetros de definição. Dependendo de como são declarados os parâmetros de definição no procedimento, é determinado se os parâmetros de chamada conterão ou não os valores contidos nos parâmetros de definição. Isso define o modo de passagem dos parâmetros: passagem por referência e passagem por valor. Quando se declara um parâmetro como sendo de referência, as atribuições à ele são refletidas no parâmetro de chamada correspondente, após a execução do procedimento o parâmetro de chamada conterá o mesmo valor que o parâmetro de definição correspondente. Para especificar se um parâmetro terá passagem por referência, a sua declaração deverá ser precedida pela palavra-chave var.

Caso a declaração não seja precedida por var, então o parâmetro possui passagem por valor. Neste caso, os parâmetros de definição conterão os mesmos valores de seus parâmetros de chamada correspondente no momento da ativação, mas alterações nos parâmetros de definição não serão refletidas nos parâmetros de chamada correspondente. Pode-se dizer também que um parâmetro com passagem por referência é um parâmetro de entrada e saída, enquanto que um parâmetro com passagem por valor é um parâmetro de entrada.

Exemplo:

program exemplo_function_2;
{ program que calcula o fatorial de N com a utilização de uma função
com passagem de parâmetros }
var N : integer;

    function fatorial(fat : integer): integer;
    var i, acumul : integer;
    begin
          acumul := 1;
          i := 1;
          while (i <= fat) do
          begin
              acumul := acumul * i;
              i := i + 1;
          end;
          fatorial := acumul;
    end;
begin   write('Digite o valor de N: ');
  readln(N);
  writeln('O valor do Fatorial de ',N , ' é = ', fatorial(N));
end.

program exemplo_procedure_2;
{ programa que utiliza uma procedure para ler os valores em uma matriz
N x M e uma procedure que imprime os valores de uma matriz M x N }
const
M = 10;
N = 10;

type
matriz = array[1..M,1..N] of integer;
var
    a : matriz;
    numlin, numcol : integer;

    procedure le_matriz(var mat : matriz; lin, col : integer);
    var i, j : integer;
    begin
        for i:= 1 to lin do
            for j := 1 to col do
                read(mat[i,j]);
    end;

    procedure imprime_matriz(mat : matriz; lin, col : integer);
    var
    i, j : integer;
    begin
        for i:= 1 to lin do
        begin
            for j := 1 to col do
                write(mat[i,j]:10,' ');
            writeln;
        end;
    end;

begin { programa principal }
    write('Entre com o número de linhas da matriz (<',M, '): ');
    readln(num_lin);
    write('Entre com o número de colunas da matriz (<',N, '): ');
    readln(num_col);
    le_matriz(a,num_lin,num_col);
    imprime_matriz(a,num_lin, num_col);
end.


Aula Anterior | Índice | Próxima Aula