Problema com passagem de argumentos em C

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?!
 
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:
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);

Passagens por parametros requer que passes os endereços das variaveis(excepção feita aos arrays),

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
 
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:
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..

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.
 
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.

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.
 
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.

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.
 
Back
Topo