1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Problema com passagem de argumentos em C

Discussão em 'Programação' iniciada por Xikinho90, 14 de Novembro de 2007. (Respostas: 7; Visualizações: 1522)

  1. Xikinho90

    Xikinho90 Power Member

    Boas pessoal, estou a fazer um programa em C, e criei uma função chamada atribui, que tem como parâmetros dia, mes e ano, ou seja, void atribui(int dia, int mes, int ano).

    Depois chamo essa função na função inserir, e dentro da função inserir ela fica atribui(ptr->inicio.dia , ptr->inicio.mes , ptr->inicio.ano);

    Mas quando estava a correr o programa notei um erro, e fui correr o debuger, e apercebi-me que ele simplesmente, não atribui nada as variáveis da estrutura...

    Já me explicaram que era porque ele apenas criava replicas do apontador e depois destruía-as mas eu não percebi muito bem, e muito menos fiquei a perceber como resolver isto, alguma ajuda por ai?!
     
  2. MadOnion

    MadOnion Folding Member

    Se não me engano quando chamas a função atribui, tens que fazer:
    Código:
    int dia, mes, ano; //com as variaveis inicializadas claro
    atribui(&dia, &mes, &ano);
    
    No corpo da função fazes:
    Código:
    void atribui(int *dia, int *mes, int *ano);
    
    Isto é passagem por feferência.
    Passagens por parametros requer que passes os endereços das variaveis(excepção feita aos arrays que não é preciso passar com o &), e não o valor delas, porque senão não consegues reutilizar os valores delas.
    Estarei a induzir em erro? Espero que não.
     
    Última edição: 15 de Novembro de 2007
  3. CoolMaster

    CoolMaster Power Member

    Excepção feita aos arrays porque? É exactamente a mesma coisa!

    Repara que:
    array == &array[0]

    Portanto sempre que passas um array passas um array para uma função na realidade passas um pointer. Da mesma forma que passas um endereço de uma variavel tambem podes passar o endereço um de endereço (pointer to pointer, **), isto da jeito quando queres passar um array por referência (aquilo que chamas de passagem por paramêtros, não entendo porque mas não sou expert na terminologia que se costuma dar nas univ e livros portugueses).

    De resto, respondeste bem :p
     
  4. Xikinho90

    Xikinho90 Power Member

    Deu imensos erros, o que eu pretendo é chamar a função duas vezes, uma vou usar o apontador, outra uma variável do tipo inteiro, se não seria fácil..

    punha nos parâmetros atribui(struct ola *)

    ...os erros que me deu eram principalmente, nonportable pointer conversion, e ilegal use of pointer

    se alguém quiser o código para corrigir diga...

    EDIT: Julgo que já estou a atinar com isto, procurei passei por referencia no google e estou a chegar lá... já me tinha esquecido do que era a passagem por referencia...

    EDIT2: Afinal não, neste momento dentro da função os valores estão correctos, mas quando a função e chamada eu faço um printf e vejo que os valores são absurdos...
    Amanha corro o debuger...
     
    Última edição: 15 de Novembro de 2007
  5. Consu

    Consu Power Member

    Qual é a lógica de fazer isso? Uma vez alteras as variáveis, outra vez só usas os valores???
    Acho que seria útil explicares ao certo o que pretendes, aí talvez fosse mais fácil podermos ajudar. No que toca ao alterar o valor isso já foi explicado, daí não compreender qual é exactamente a tua dúvida.
     
  6. MadOnion

    MadOnion Folding Member

    Disseste bem, um array não passa de um pointer, se fizeres, funcao(array), funciona na mesma, se fizeres funcao(array[0]); idem. O que eu queria dizer é que não é preciso o &. Provavelmente foi um mal entendido.
     
  7. CoolMaster

    CoolMaster Power Member

    Não... array[0] não é o mesmo que array.. mas &array[0] já é! E podes tambem precisar de um pointer to pointer a passar para uma função, logo &array , tambem faz sentido nesse contexto.
     
  8. Xikinho90

    Xikinho90 Power Member

    Já consegui resolver o problema, afinal eu passava o endereço(&) e não conteúdo(*)....

    Obrigado pela vossa ajuda
     

Partilhar esta Página