Passagem de Parâmetros

14 respostas
paloma

Alguém pode me explicar quando sei a necessidade de passar ou não parâmetros para uma função, ainda não estou conseguindo identificar quando devo fazer isso? :roll:

14 Respostas

ramilani12

Paloma , juro que não entendi a sua dúvida ? :slight_smile:

Pedrosa

Acho que seria método e não função, ao utilizar alguma IDE como Eclipse vc consegue ver a assinatura desses métodos e consequentemente ver os parâmetros que eles precisam.

paloma

Olha só, eu tenho a função abaixo e passei parâmetros para ela, que no caso eu poderia ter declarado dentro da função, quero saber como posso identificar a necessidade de passar os parâmetros ou não :wink:
Aqui estou me referindo a linguagem C :wink:

int pilha_vazia(TPilha *p) 
{ 
    return (p->n==0); 
}
int pilha_vazia(void) 
{ 
   TPilha *p;
    return (p->n==0); 
}
ramilani12

A necessidade de passagem de parametros , significa que vc precisa retornar algum valor …

peczenyj

Entra ai o conceito de visibilidade e blocos de código.

Um bloco de código em C (assim como Java) é definido entre um par { e }

assim

int main (void){ // inicio do bloco principal

 if(condição) { // inicio do bloco deste if

 } // fim do bloco do if
 
 for(lala;bebe;cafe) { // outro bloco

 } // fim outro bloco

 printf(...); /* o bloco de código do printf não está subordinado ao main
é uma função definida externamente, fora do main ! */
} // fim do bloco principal

O que acontece é que as variaveis declaradas em um bloco só são visiveis dentro do seu bloco e nos blocos nela contidos. não são visiveis pra fora.

Se vc declarar uma variavel dentro do bloco do if, não vai conseguir ler o seu valor dentro do outro bloco, ou do bloco principal.

Ja parou para pensar como isso é util ? imagina que vc tem uma variavel 'i' que vc usa em um bloco para algo. imagina se ela 'de repente' fosse acessada por outra porção de código que vc desconhece e mudasse de valor, repentinamente. Pô, é sacanagem... na verdade existem casos de variaveis sendo alteradas de forma não explicita (para isso existe a palavra reservada volatile em C), mas ai são outros 500.

Quando passar parâmetros ? Depende de como vc montou o seu programa. Geralmente usamos funções para substituir uma parte do código que se repete muito, ou para tentar deixar o programa legível, agrupando certas funcionalidades ou passos. Se precisar trocar informações entre estas porções de código, vc pode faze-lo informando parâmetros apropriados.

Quando vc faz:
printf("mensagem");

vc está passando os parâmetros necessários para o printf funcionar. Talvez vc ache desnecessario ter um código assim se, por exemplo, vc tiver uma variavel chamada mensagem. Vc poderia ter algo assim

mensagem = 1000;
print();

ai a sua função print deverá identificar uma variavel chamada mensagem e imprimi-la. Até ai, no nosso experimento mental, pode funcionar.

Mas o bloco onde está a variavel mensagem e a variavel mensagem são totalmente diferentes ! São 2 funções separadas ! Vc só irá conseguir esse tipo de 'troca de informação' se a variavel mensagem for uma variavel global, isto é, definida fora dos blocos de código.

Agora o que é mais facil de entender ?

print(1000); //imprime 1000

ou

print(); // imprime o que ?

Outra coisa: quando lidamos com funções, lidamos com possiveis dados que uma função pode retornar. printf, por exemplo, retorna um inteiro que, se funcionou corretamente, retorna o numero de caracteres impressos. mas dificilmente alguem faz

a = printf(...);

Isto por que não somos obrigados a atribuir o valor retornado por uma função. Entretanto fazer uma função declarada como void

a = função_que_retorna_um_void(...);

causa um erro em tempo de compilação.

Veja um exemplo seu:

int pilha_vazia(void) 
 { 
    TPilha *p;
     return (p->n==0); 
 }

aqui vc declara um ponteiro pra uma variavel do tipo TPilha e ai verifica se "componente" n dessa estrutura é identico a 0.

Veja bem, vc CRIOU uma variavel. quando vc cria dessa forma vc não inicializa nenhum valor nessa estrutura. p->n não tem valor definido. Se vc tem uma variavel do tipo TPilha no seu programa e vc quer eliminar uma parte do código que verifica se p->n == 0, se p não é uma variavel global, eu tenho que passar como argumento dessa função

int pilha_vazia(TPilha *p){ 
     return (p->n==0); 
 }

Perceba que eu posso usar a sua função tanto assim

a = pilha_vazia(alguma_coisa);

como

pilha_vazia(alguma_coisa);

como

if(pilha_vazia(alguma_coisa)) ...

;-)

paloma

E qual seria a diferença de declarar essa variável dentro da função?

ramilani12

Paloma se vc criar uma variavel dentro de uma função, ela e so visivel dentro da função

A diferença entre variaveis locais e globais …tente usar a variavel fora da função

paloma

Quero saber a diferença de declarar uma variável dentro da função e passar a mesma como parâmetro desta função :roll:

peczenyj

Caso 1

função(){ int i; // criando uma variavel dentro da função for (i=0;i<10;i++) ... }

Caso 2

função(int i){ ... }

no caso 1, declaramos uma varaivel dentro de uma função. Pra que ? por que eu preciso de uma variavel ali dentro, pra fazer alguma coisa… como qualquer variavel em c, eu declaro informando o seu tipo, posso colocar algum modificador, etc. Porém esta variavel NAO tem nenhum valor até ser inicializada.

no caso 2, a variavel i tem o valor que for passado pra ela, externamente.
vou usar i dentro da função e até posso atribuir outro valor pra ela. quando eu fizer

função(10);

a variavel i é inicializado com o valor 10 dentro da função

se eu fizer

a = 10;
função(a);

nesse caso, o valor da variavel é COPIADO pra dentro. a não vai ser alterador pela função. imagine a função printf - ela não altera o conteudo de suas variaveis, apenas imprime.

entretanto se eu passar o endereço de memoria da variavel, a função pode acessar o conteudo da variavel. e altera-la ao seu bel prazer. é a forma que o scanf faz para ler um resultado. faz-se necessario conhecer ponteiros para fazer isso de forma correta. em C++ a sintaxe é mais clara do que ANSI C.

scanf("%d",&a); /* usando o operador & para passar o endereço de memoria. */

esclarecida ?

Em java isso não é possivel para tipos primitivos, e para objetos vc pode passar a referencia do objeto e altera-lo dessa forma, mas não existe a manipulação de ponteiros diretamente (ok, tem aquela API da SUN, mas é como cabeça de bacalhau…).

paloma

No caso 2 (i) o valor passado externamente pode ser calculado a partir de outra função, quer dizer que se eu fosse fazer qualquer tipo de calculo dentro da própria função não seria necessário passar parametros certo? :roll:

peczenyj

de certa forma sim

paloma

Ok, acho que depois de tantas explicações finalmente eu entendi.

Valeu pela ajuda e paciência :lol:

peczenyj

Valeu nada, são 500 reais :twisted:

paloma

Eita então só a vc eu devo estar devendo uma fortuna :wink:

Criado 4 de maio de 2006
Ultima resposta 4 de mai. de 2006
Respostas 14
Participantes 4