Академический Документы
Профессиональный Документы
Культура Документы
Funes
inc quadrado ( nt a l
(
reLurn a *a;
l
' ~--~----------~M-1c_rocoo
~_1ro1__ado__re_s_P1_c_-_Pr_og~rama--~_o_e_m_c______~~~~---.
'
Exemplo 9.1
linclude <16F628 . h>
luse delay(clock=4000000)
tfuses INTRC_IO,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
luse rs232(baud=19200 ,parityzN,xrnit=PIN_B2.rc v=PI N_Bll
main ()
{
printf ( '1 ~ 1 = %d ' , soma(l,11 ) ;
}
Neste programa. foi definida uma funo chamada soma , que ir retomar
o valor da soma dos seus parmetros "a" e "b". Observe que a palavra lnt
colocada frente do nome da funo especifica que ela vai retornar um valor
do tipo inteiro de 8 bits.
No corpo da funo encontramos apenas o cdigo retum a+b, que utili-
zado para provocar o retorno da funo com o valor especificado, o que no
caso ser a soma do valor dos parmetros "a" e "b" .
No corpo principal do programa ( maln() ) encontramos a funo prlntf
que em um dos seus argumentos realiza uma chamada funo soma com os
parmetros iguais a 1.
Veja que a funo soma recebe os valores 1 e 1 como argumentos e du-
rante a execuo da funo teremos "a =1" e "b =1".
A execuo do programa resulta na seguinte sada:
1 + 1 : 2
rnain ()
{
float a,b,c ;
a = 7;
b = 3;
e = divide (a,b) ;
printf('a= %f , b = %f, e= %f,a,b, c);
l
Exemplo 9.3
#include <16F628 . h>
tuse delay {clock=4000000)
#fuses HS,NOWDT,PUT,NOBROWNOUT,NOMCLR,NOLVP
l use r s232 (baud=19200, parity,.N, xmi t=PIN_B2, rcv,.,PIN_Bl)
main ( l
(
float a, b;
a "' 7 ;
b "' 3;
divi de (&a,&b) ;
printf ( a= %f , b = %f,a,b);
}
a = 2 . 333333 , b= 3 .000000
Observe que agora o valor da varivel "a", que local funo maln , foi
alterado: o resultado da operao de diviso realizada na funo divide foi
armazenado diretamente na varivel "a" citada .
Por que a varivel "a" foi alterada?
Simples: o valor passado para a funo divide no foi o valor de "a" e sim
o endereo da varivel local "a" da funo maln . Isto permite que a funo
divide altere o valor apontado pelo endereo localizado no seu parmetro "a".
Exemplo 9 .4
Exemplo 9.5
void sorna ( int matr iz[] , int valor)
/ / sorna o parametro valor a todos os elementos da matriz
{
int conta;
for (conta=O; conta<20; conta++) matriz[contaJ+= valor;
}
main ()
{
int valores ( 20 J ;
soma (valores, lJ;
)
3. Declarando um ponteiro para o mesmo tipo da matriz na lista de parme.
tros da funo.
Neste caso, em vez de utilizar a matriz como elemento da lista de par-
metros da funo, o programador utiliza apenas um ponteiro do mesmo
tipo de dado da matriz e que ir receber o endereo dela. Veja o mesmo
exemplo anterior reescrito:
Exemplo 9.6
void s orna ( int *matriz , i nt valor)
l i soma o parametro valor a todos os e l ementos da matriz
{
i nt conta;
for (conta=O; conta<20; conta++) matriz[conta]+= valor;
)
main ( )
{
int valores [20J;
soma (valores , l);
}
~~~~~~~~~M_ic_ro~
con_t~_a_d~~~-P_IC_-_P_rog~ra_ma__o_e_m_C~~~~~~~--.\
A forma bsica de declarao de uma funo com mltiplos parmetros :
9. 7. Retorno de Valores
Existem duas formas bsicas de uma funo retornar a execuo ao local
de onde foi chamada:
Pelo trmino da execuo de todos os comandos da funo;
Pela execuo da declarao return .
O retomo da funo pelo trmino da execuo uma forma bastante evi-
dente.
Sempre que a execuo de uma funo alcana o seu ltimo comando,
ocorre o retorno da funo, ou seja, o endereo de retorno retirado da pilha
e carregado no contador de programa do processador, desviando a execuo
para o ponto seguinte chamada da funo.
Abaixo temos um exemplo de retorno de uma funo pelo trmino da exe-
cuo dos seus comandos:
Exemplo 9.7
#include <16F628 . h>
t use delay(clock=4000000)
tfuses lNTRC_IO,NOWDT,PUT,NOBROWNOUT.NOMCLR,NOLVP
main {)
(
muda_pino{pin_b3); li inverte o nvel 16gico do pino RB3
)
Foi definida a funo muda_plno, que possui como parmetro o inteiro
pino, que ser utilizado para especificar o pino a ser Invertido pela funo.
Observe que o tipo de dado retomado pela funo vold, ou seja, ne-
nhum valor retornado pela funo.
No corpo da funo encontramos uma chamada a outra funo interna do
compilador: output_blt, que utilizada para colocar um determinado pino do
microcontrolador (o primeiro argumento) em um determinado nvel lgico (o
seu segundo argumento).
Ao trmino da execuo da funo output_blt, a funo muda_pino efetua
o retorno, j que no existe mais cdigo a ser executado.
Um aspecto importante sobre o retorno pelo trmino da execuo da fun
o que neste tipo de retorno de funo, ela normalmente ir retomar urr
valor O. Para que ela retorne outros valores, necessrio utilizar a declarao
return.
Como j foi dito, por padro, uma funo C que no possua declarao de
tipo considerada como sendo do tipo inteira, o que significa que o valor a ser
retornado (return) pela funo ser do tipo inteiro.
,
E possvel retornar outros tipos de valores, bastando selecionar adequa
damente o tipo de dado na especificao de tipo da funo.
Em seguida temos um exemplo de um programa que utiliza mltiplas de-
claraes retum em uma funo cujo tipo de dado de retorno float:
Exemplo 9.8
finc l ude <16F620.h>
#use delay(clock;4000000)
f!uses I!l.'TRC_IO,NOWDT,PU1,NOBROWNOUT,NOMCLR,NOLVP
~ use rs232(baud=l9200,parity=N,xrnit=PIN_B2,rcvcPIN_Bl)
main ()
(
f loat a ,b;
a= 7;
b = 3;
a= divide (a,b);
printf(a= tf , b= \f',a,b);
}
Alm de demonstrar a utilizao de uma funo com tipo de retomo diver-
so do inteiro, o exemplo anterior demonstra tambm que:
possvel utilizar o mesmo nome para variveis locais (como "a" e
"b" na funo maln) e para as variveis utilizadas como parmetros
formais de outra funo ("a" e "b" na funo divide);
possvel utilizar diversas declaraes retum numa mesma funo;
Caso no seja explicitamente declarado o valor de retorno (atravs do
uso da declarao retum, ou equivalente), o valor retornado pela fun-
o ser indefinido.
Um outro aspecto importante a ser destacado que, caso no seja dese-
j ado o retorno de valores da funo , ela deve ser declarada preferencialmente
como vold, o que acarreta, na maioria das vezes, uma maior eficincia e redu-
o do cdigo gerado.
Exemplo 9.9
mai n()
{
int a,b;
a= 7;
b = 3;
a = soma ( a , b ) ;
}
9.9. Prottipos de Funo
Muitas vezes, quando um programa fica muito complexo e so utilizadas
muitas funes, pode acontecer de ocorrer uma chamada a uma funo que
somente definida mais adicante no programa.
Exemplo 9.10
#include <16F628 . h>
#use delay(clock=4000000)
#fus e s rNTRc_rO , NOWDT , PUT, NOBROWNOUT , NOMCLR,NOLVP
#use r s 232(baud=19200,pa rity=N,xmit=PIN_B2,rcv=PrN_Bl)
li declaraao da fun o
9.11.. Exerccios
.
1) possvel ter duas variveis com o mesmo nome, estando uma sr-
tuada em uma funo e outra fora de todas as funes?