JoaoNascimento Posted April 29, 2010 at 08:32 PM Report #324149 Posted April 29, 2010 at 08:32 PM Alguem me explica o funcionamento de estruturas e como passar os parametros de estruturas entre funções? http://www.joaonascimento.info
Localhost Posted April 29, 2010 at 09:03 PM Report #324163 Posted April 29, 2010 at 09:03 PM Depende do que queiras. Queres modificar a struct dentro da função? here since 2009
JoaoNascimento Posted April 29, 2010 at 09:07 PM Author Report #324165 Posted April 29, 2010 at 09:07 PM Tenho a seguinte estrutura: typedef struct dados { char curso[N][50], nomeuc[N][50], doc_res[N][50], area_cientifica[N][50]; float t[N], tp[N], pl[N], p[N], ac[N], ot[N], s[N], turm_t[N],turm_tp[N], turm_p[N], turm_pl[N], turm_ac[N], turm_ot[N], turm_s[N], docentes[N]; int ects[N], opcional[N], ano[N], i, semestre[N]; } DADOS; Que quero preencher numa função que vai ler ao ficheiro: void ler_dados_fich(DADOS dados) { char cabecalho[1000]; int i=0; FILE *pfdados; pfdados=fopen("dados_ucs_070410.txt","r"); if(pfdados==NULL) { printf("Erro ao abrir o ficheiro! \n"); system("pause"); } fscanf(pfdados,"[^\n]\n",cabecalho); //printf("%s\n",cabecalho); for (i=0;i<92;i++) { fscanf( pfdados , "%[^\t]\t%d\t%d\t%[^\t]\t%d\t%[^\t]\t%d\t%[^\t]\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t\t\n",dados.curso[i],&dados.ano[i],&dados.semestre[i],dados.nomeuc[i],&dados.ects[i],dados.area_cientifica[i],&dados.opcional[i],dados.doc_res[i],&dados.docentes[i],&dados.turm_t[i],&dados.turm_tp[i],&dados.turm_p[i],&dados.turm_pl[i],&dados.turm_ac[i],&dados.turm_ot[i],&dados.turm_s[i],&dados.t[i],&dados.tp[i],&dados.p[i],&dados.pl[i],&dados.ac[i],&dados.ot[i],&dados.s[i]); } } Como é que declara essa função no MAIN()? http://www.joaonascimento.info
Localhost Posted April 29, 2010 at 09:14 PM Report #324169 Posted April 29, 2010 at 09:14 PM Se a struct está definida numa outra função sem ser essa para modificares a instância que declaraste dessa struct tens de passar por referência essa mesma instância e depois tens de utilizar o operador -> para trabalhares nos campos da instância passada. Um pequeno exemplo: typedef struct { int key; }data; int main(void) { data newData; // Declaração da instância blah(&newData); // Passar endereço para a função return 0; } void blah(data *newData) { newData->key = 10; // Modificação do campo key com o operador -> } here since 2009
JoaoNascimento Posted April 29, 2010 at 09:22 PM Author Report #324173 Posted April 29, 2010 at 09:22 PM nao percebi com o teu exemplo... http://www.joaonascimento.info
Localhost Posted April 29, 2010 at 09:29 PM Report #324178 Posted April 29, 2010 at 09:29 PM Sabes o que é passagem por referência? Se não souberes aconselho-te a leres sobre ponteiros senão torna-se dificil perceberes o exemplo. Se sabes o que é vou tentar explicar. Faço uma declaração normal de uma estrutura que defini como sendo de um tipo que eu chamei "data" depois na função main declarei uma instância desse mesmo tipo "data". Passei para a função blah o endereço dessa instância para que possa modificar nessa função blah o conteúdo da instância (aqui entra a passagem por referência). Na função blah declarei um ponteiro que é o que vai receber o endereço da instância que passei para a função blah da função main. Depois utilizo o operador -> para modificar o campo key da instância que me foi passada. De notar que para modificar instâncias apontadas por um ponteiro (como é o caso), ou melhor, para se desreferenciar ponteiros que apontam para estruturas tem de se utilizar este operador. Para perceberes melhor a utilização deste ponteiro vê o seguinte código e considera que já está definida a estrutura (considera a do código anterior): data newData; data *pt = &newData; pt->key = 666; here since 2009
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now