Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
JoaoNascimento

Estruturas -> Passagem de parametros para função

Recommended Posts

Localhost

Depende do que queiras. Queres modificar a struct dentro da função?


here since 2009

Share this post


Link to post
Share on other sites
JoaoNascimento

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()?

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites
Localhost

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

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.