Aula 15: de variáveis e procedimentos



Esta aula:

Âmbito das variáveis: Global e local


  variáveis Globais são variáveis que têm definição no programa inteiro.

  variáveis Locais só têm definição dentro de um procedimento ou função.
Com esta nova informação é muito mais fácil saber quais as variáveis nos podemos usar onde. Dentro dos procedimentos podemos usar as variáveis globais e locais. Fora dos procedimentos podemos só usar variáveis globais. Lembra aula12 (veja a imagem aqui ao lado). O programa principal não pode (consegue) usar as variáveis dos módulos, mas os módulos podem usar as variáveis globais.
Aviso: Evita usar variáveis globais nos procedimentos! Porquê? É simples. Com o uso das variáveis globais, cópiar procedimentos para uso num outro programa será mais difícil. Provavelmente o outro programa não tem as mesmas variáveis globais. Por isso, só usar variáveis locais é melhor. Se quer usar as variáveis globais num procedimento, passa-lhes como parâmetros ao procedimento. Idealmente, o procedimento é uma unidade independente do resto do código e pode ser compilado seperado do programa.

 
Mais uma observação, tipicamenta para PASCAL e linguagens parecidas (single-pass compilers): variáveis só podem ser usadas nos lugares depois as suas declarações. Então, se pudemos a declaração de uma variável depois um procedimento, este procedimento não consegue ver a variável. 
Vamos analisar alguns exemplos. Ao primeiro o exemplo da aula 13:
PROGRAM WithParameters;
 (* global variables x and z *)
Var x, y: real;

FUNCTION Square(r: real): real;
 (* local variable localr *)
var localr: real;
begin
  localr := r*r;
  x := localr;
  Square := localr;
end;

begin
  x := 4.0;
  y := Square(x);
end.


Prioridade


x é uma variável local e global.
Dentro do procedimento, a versão local será usada.
Se existem variáveis locais e globais com o mesmo nome, a variável local tem mais alta prioridade e, portanto, vai ser usada no procedimento. De qualquer modo, isto dá confusão e por isso evita nomes iguais para as variáveis e constantes!

Há linguagens (por exemplo BASIC) que não têm uma distinção das variáveis locais e globais. isto significa que não podemos usar a mesma variável duas vezes.


Passagem por valor ou passagem por referência

Há duas maneiras para passar parâmetros aos procedimentos, pode ser "passing by value", ou "passing by reference".
Passagem por valor (passing by value):
Até já usámos este tipo de passar os parâmetros aos procedimentos (procedures e functions). Nesta maneira, só o valor será passado. Não importa o que acontece dentro do procedimento com este valor, o valor da variável original usada para chamar o procedimento ficará igual. Como exemplo, para esclerecer isto um pouco mais, assume que nos temos um procedure que escreve o quadrado do parâmetro p no ecrãn. Para calcular o quadrado atribuimos um novo valor (p*p) a p. Então, o valor de p mudará dentro do procedimento:
  PROCEDURE WriteSquare(p: real);
  begin
    p := p*p;
    WriteLn(p:0:1);
  end;
Agore, se nos chamamos este procedimento com a variável x, o valor de este variável não mudará. No programa principal:
  begin
    x := 2.0;
    WriteSquare(x);
    WriteLn(x:0:1);
  end.
Depois de voltar do procedimento, o valor de x não mudou. Então, o output completo do programa acima será
  4.0
  2.0

Passagem por referência (Passsing by reference):
Por outro lado, se nos queremos mudar o valor da variável usada para chamar o procedimento, podemos especificar isto na altura de definição do procedimento. Basta pôr a palavra Var em frente do cada parâmetro que deve mudar a variável permanentemente:
  PROCEDURE WriteSquare(Var p: real);
  begin
    p := p*p;
    WriteLn(p:0:1);
  end;
Agora, se corremos o programa, o output será
  4.0
  4.0
porque o valor de x mudou simultaneamente com o parâmetro p.
 

 
Passing by value
Passing by reference

No análogo de visiualizar variáveis com caixas: passing by reference é dar a caixa (variável) ao procedimento e o procedimento pode usar e mudar o valor na caixa. No fim, o procedimento devolve a caixa com o novo valor. Enquanto, passing by value é equivalente com abrir a caixa, cópiar o conteudo (valor da variável) e só dar este valor ao procedimento. Obviamente, o valor original ficará na caixa e não mudará.
Num outro exemplo: Posso te dizer o saldo da minha conta no banco, o que podes usar para calcular o valor equivalente em dolares, ou vou te dar a direita de mudar o conteudo da minha conta. Provavelmente o saldo vai mudar permanentamente.


Mini Teste


Para testar o seu conhecimento, sobre o que aprendeu nesta aula, clique aqui para um teste on-line.


Peter Stallinga. Universidade do Algarve, 6 Abril 2002