Aula 15: de variáveis e procedimentos |
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: |
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.
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 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.
|
|
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.
Para testar o seu conhecimento, sobre o que aprendeu nesta aula,
clique aqui para um teste on-line.