VinBR

LP 31/10/2011

Nov 29th, 2011
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.93 KB | None | 0 0
  1.  
  2. # # # # # # # # # # # # # #
  3. # Linguagens de Programação #
  4. # Prof. Fernando Pereira #
  5. # notasdogarcia.blog.com #
  6. # # # # # # # # # # # # # #
  7.  
  8. O que são parametros formais e parametros reais mesmo?
  9.  
  10. Isso existe em linguagem cálculo lambda:
  11.  
  12. (/x x+1) y
  13.  
  14. x é o parametro formal
  15. y é o parametro real
  16.  
  17. Agora seja uma linguagem mais de alto nível:
  18.  
  19.  
  20. foo(int x, int y)
  21. foo(2,3)
  22.  
  23. 2 e 3 são parametros reais, enquanto x e y formais.
  24.  
  25. Como conseguimos diferenciar qual parametro formal é o x e qual é o y?
  26.  
  27. O mais simples é a ordem, o que vem primeiro é o x e o que vem depois é o y.
  28.  
  29. def div(divident=1.0, divisor = 1.0):
  30. r = divident/ divisor
  31. print "Resultado = ", r
  32.  
  33. veja o exemplo:
  34.  
  35. div(1.4, 3)
  36. é igual à:
  37. div(divisor = 3, divident = 1.4)
  38.  
  39. Ou seja pode-se adicionar um label aos parametros e utiliza-lo para essa identificação.
  40.  
  41. Pode-se também realizar o casamento misto:
  42.  
  43. div(divident = 3, 1.4)
  44.  
  45. mas nesse caso é preciso que as posições estejam corretas.
  46. // daria erro caso contrário.
  47.  
  48. Outra coisa que se pode fazer é adicionar valores padrões para os parâmetros formais.
  49. Assim pode-se adicionar um valor sem este ser definido pelo usuário.
  50.  
  51. Pode-se ter um número variável de parametros?
  52.  
  53. Sim. Em C e C++ por exemplo pode escrever uma função do tipo:
  54.  
  55. printf(char* formato, ...);
  56.  
  57. // Nota: para se implementar isso usa-se 3 funções da biblioteca: stdarg.h:
  58. // va_list ap;
  59. // va_start(ap, nargs);
  60. // va_arg(ap, tipo do argumento);
  61. // va_end(ap);
  62.  
  63. // O professor mostrou que como essa forma é muito crua, se voce passa o primeiro parametro com o número de parametros que o seguem.
  64. // sem informar o tipo, e eu procuro por tipos inteiros, mas uso um tipo long int, como parametro real.
  65. // da biziu pq eu to lendo de 32 em 32 bits. aí complica.
  66.  
  67.  
  68. O professor mostro um exemplo em python:
  69.  
  70. def f(a, L=[]):
  71. L.append(a)
  72. return L
  73.  
  74. Pela gramatica de python se eu chamar f(1) f(2) e depois f(3), o retorno será: [1] depois [1,2] e depois [1,2,3]
  75. Motivo: o argumento padrão na verdade não é uma lista vazia, mas sim um ponteiro estatico de lista pre-alocado.
  76.  
  77. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  78.  
  79. Seja o programa em c:
  80. int main(int argc, char* argv[]){
  81. printf("%s\n", argc);
  82. }
  83.  
  84. Qual o erro?, um seg fault provavelmente, pois não há amarração entre o tipo de argc e seu uso dentro da função printf.
  85.  
  86. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  87.  
  88. Quais os tipos de passagens que temos?
  89.  
  90. - Valor
  91. - Referencia
  92. - Resultado
  93. - Valor-Resultado
  94. - Expansão de Macros
  95. - Nome
  96. - Necessidade
  97.  
  98. Vamos falar disso na ordem.
  99.  
  100. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  101.  
  102. O que é passagem por valor?
  103.  
  104. São passagens onde o item recebido como parametro tem o mesmo valor do original mas não se trata do mesmo objeto.
  105.  
  106. Assim uma passagem por valor não é capaz de alterar o valor original dos parametros.
  107.  
  108. // Linguagem que recebe parametros só de valor: C
  109.  
  110. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  111.  
  112. E uma passagem por referencia?
  113.  
  114. Também já conhecemos bem essa passagem, é uma passagem onde o que é recebido é o valor do endereço do parametro real original.
  115.  
  116. Na prática passagem por referencia significa passar o próprio objeto original, assim alterações realizadas dentro da função são notáveis na variável original.
  117.  
  118. // Linguagem que recebe parametros só de referencia: Java
  119. // Linguagem que recebe tanto parametros de referencia quanto de valor: C++
  120.  
  121. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  122.  
  123. // O professor mostrou exemplos de valor e referencia em C e C++, e os comparou.
  124. // Em C++ um parametro por referencia é o & junto aos parametros formais.
  125. // O professor mostrou que de fato a passagem por referencia de C++ é equivalente a passagem por valor de ponteiro do C.
  126. // Em outras palavras, passagem por referencia é um açucar sintático sobre o uso de ponteiros.
  127.  
  128. // Riscos de passagem por referencia: Efeitos colaterais.
  129. // O professor deu um exemplo de um swap(int& a, int& b) que utiliza um xor para trocar os dois inteiros de posição.
  130. // Porém se voce realizar a chamada: swap(a,a) a é zerado, pois na verdade era preciso que o endereço dos parametros fossem diferentes para o funcionamento.
  131.  
  132. // Em outras palavras, C++ que permite passagem por referencia opcional, te permite dar tiros no pé.
  133.  
  134. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  135.  
  136. dado um exemplo em java:
  137. Object(x) = null;
  138. makeString(x) (onde makeString retorna x="Isto é uma string")
  139. printf(x)
  140.  
  141. O que acontece?
  142. É impresso null.
  143. Porque de fato o parametro x foi passado por valor.
  144.  
  145. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  146.  
  147. Passagem por resultado:
  148.  
  149. É quando um de seus parâmetros é passado como referencia de um retorno.
  150. Ou seja, ao fim da função voce escreve nesse endereço um dos retornos, isso é usado em C de forma explicita, e implicitamente isso é usado em outras linguagens,
  151. e é chamado de passagem por resultado.
  152.  
  153. ex:
  154. foo ( Res a, int a, int b)
  155. Res é um parametro de retorno.
  156.  
  157. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  158.  
  159. // Nota solta: macros em C fazem algo que pode ser chamado de passagem por referencia, se voce pensar bem.
  160.  
  161. Passagem por Expansão de macro:
  162. Como já sabemos uma macro é uma cópia do código na macro no contexto onde seu nome foi chamado.
  163.  
  164. Assim para efeitos práticos sua passagem é semelhante à uma por referencia com as seguintes peculiaridades:
  165. Se o parâmetro é uma expressão ele só será avaliado no momento do uso, ou seja para cada vez que ele é usado dentro da macro a expressão é resolvida uma vez.
  166. O que pode ser ineficiente.
  167. Outro problema é a ambiguidade, já que #define f(a) (a*2) retorna 8 para f(4), mas 6 para f(3+1)
  168.  
  169. Outro problema é que uma variável local a macro pode afetar o contexto da função que a chamou o que pode também ser complicado.
  170.  
  171. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  172.  
  173. Passagem por Nome:
  174.  
  175. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  176.  
  177. Passagem por Nessecidade:
  178.  
  179. Tem a vantagem da passagem por expansão de macro que é o fato de voce só avaliar a expressão sob demanda.
  180. Porém ele não altera o escopo original, e não avalia um mesmo parametro duas vezes, ele guarda em um cache o resultado e não avalia mais.
  181. Outra característica interessante é que só se passa parametros por necessidade.
  182.  
  183. // Haskell é uma linguagem elegante, disse o professor.
  184.  
  185. Haskell é uma linguagem que realiza um fibonichi bem voce lembra diso.
  186.  
  187. // Fim da aula.
Advertisement
Add Comment
Please, Sign In to add comment