Parâmetros formais
- Lista de parâmetros que o subprograma recebe (com tipos)
- Estabelece nomes locais para a manipulação dos dados
int soma (int a, int b);
\pause Parâmetros reais
- Argumentos usados na chamada ao subprograma
- Valores (reais) passados à unidade chamada
soma (10, 2); soma (a, 2*a);
Elementos
- Nome
- Tipo
- Modo de passagem do parâmetro (opcional, se há vários)
- Inicialização do parâmetro (opcional, quando permitido)
Exemplos
int soma (int a, int b);
Procedure somar (a: integer; var b: integer);
- (void) getTune: (out Tune*) theSong;
int soma (int a = 0, int b = 10);
Em geral, ambos são alocados na pilha
Variáveis locais: no RA do subprograma
Parâmetros formais
- Podem estar ou no RA do chamado, ou no do chamador
- Outra implementação possível?
Exemplo \small
void trocaInteiro (int *u, int *v) {
int t;
t = *u;
*u = *v;
*v = t;
}
int main () {
int a = 3, b = 5;
trocaInteiro (&a, &b);
}
Em geral, devem concordar com os parâmetros formais
- Quantidade
- Tipos
- Ordem
- Modo de passagem de parâmetros (valor, referência, etc)
\pause Considerando os seguintes parâmetros formais
void somaA (int a = 0, int b = 0);
Procedure somaB (a: integer; var b: integer);
- x e y devem ser passados como inteiros
\small
somaA (x, y);
- Assume que b = 0
\small
somaA (10);
- z é passado por referência
\small
somaB (10, z);
Definir uma regra de vinculação entre formais e reais
- Existem várias abordagens
Posição sintática (mesma ordem, quantidade e tipo) \small
float pag (float p1, float p2, float p3);
\normalsize \pause Nome (conhecido também por palavras-chave) \small
proc1 (in out a, b, c)
proc1(a => x, b => y, c => z)
\normalsize \pause Mista \small
proc1(x, c => z, b=> y)
\pause Valor Padrão \scriptsize (C++, devem aparecer por último) \small
float pag (float r, float imp=0.25, int isen=1);
calc = pag(2000f, 0.15);
calc = pag(2000f);
Nome (em Python)
def soma(lista, inicio, fim):
#...
soma(inicio = 1, fim = 2, lista = [4, 5, 6])
soma([4, 5, 6], fim = 1, inicio = 2)
Valor Padrão (em Python)
def compute_pay(income, exemptions = 1, tax_rate):
#...
pay = compute_pay(20000.0, tax_rate = 0.15)
Exemplos? \pause Java \small
public class MLP {
public static int soma (int...lista){
int resultado = 0;
for (int i:lista) resultado += i;
return resultado;
}
public static void main (String[] args){
soma(1);
soma(1, 2, 3);
soma(1, 2, 3, 5, 1000);
}
}
Exemplos? C \small
int soma (const int nargs, ...) {
int i, resultado = 0;
va_list argp;
va_start (argp, nargs);
for (i = 0; i < nargs; i++){
resultado += va_arg (argp, int);
}
va_end (argp);
return resultado;
}
int main (){
soma (2, 1, 2);
soma (5, 1, 2, 4, 10);
}