Como enviar uma struct para uma função

Conforme você estudou pelos tutoriais sobre funções em C, sabe que para passar uma variável ou vetor para uma função, devemos declarar a função com o tipo de dado esperado.
Algumas semelhanças continuam, conforme veremos nesse artigo.

Como passar uma struct por argumento para uma função em C


Assim como fizemos anteriormente ao longo de nosso curso, na hora de declarar a função declaramos o tipo de dado que ela vai receber (ou void, caso não receba nenhum argumento) e o tipo de dado que ela vai retornar (ou void).

E quando queremos passar uma struct, colamos o que, apenas struct?
Não faz sentido, pois o tamanho de uma struct em memória pode variar, dependendo da maneira como a criamos (depende de seus membros).

Se lembrar bem, no artigo passado vimos que podemos 'criar' (na verdade é criar um atalho) nossos próprios tipos com o uso do typedef.

Vamos criar, como exemplo, o tipo struct CARRO, que irá servir como padrão para declararmos alguns tipos de carros em uma concessionária.

typedef struct carro
{
                char modelo[30];
                float potenciaMotor;
                int anoFabricacao,
                    numPortas;
} CARRO;


Ora, qual nosso tipo?
Pode ser tanto 'struct carro' como pode ser CARRO.

Assim, para declarar uma função que exibe os dados do carro para um cliente, teríamos que declará-la assim:
void Exibe(struct carro car) {}

Ou seja, 'car' é o parâmetro do tipo 'struct carro'.
Porém, usamos typedef, então em vez de 'struct carro', podemos nos referir a esse tipo de struct apenas por 'CARRO':
void Exibe(CARRO car) {}

Exemplo de código C: Passando uma struct para função

Exercício: Defina uma struct de um carro. Crie um modelo de carro, preencha seus dados e exiba eles através de uma função que recebe esse tipo de struct.

Primeiro criamos a nossa struct, que será tipo CARRO, em seguida uma função que recebe um dado do tal tipo CARRO, que vamos chamar de ‘car’.
Então, quando passamos uma struct do tipo CARRO para a função, ele é vista dentro da função como a struct de nome ‘car’, bastando acessar diretamente suas variáveis e exibi-las.

Dentro da main(), criamos uma variável, ou struct do tipo CARRO, de nome ‘fusca’.
A única coisa, talvez, diferente é a maneira com a qual inicializamos nossa struct: temos que preencher todos os termos da struct, na ordem.

Veja como ficou nosso código C

#include <stdio.h>
// Curso C Progressivo: www.cprogessivo.net
// O melhor curso de C! Online e gratuito !
// Apostila online, tutorial completo sobre
// a linguagem de programação C !
 
typedef struct carro
{
    char modelo[30];
    float potenciaMotor;
    int anoFabricacao,
        numPortas;
}CARRO;
 
void Exibe(CARRO car)
{
    printf("Modelo: %s\n", car.modelo);
    printf("Motor: %.1f\n", car.potenciaMotor);
    printf("Ano: %d\n", car.anoFabricacao);
    printf("%d portas\n", car.numPortas);
}
 
int main(void)
{
    CARRO fusca = {"Fuscao preto", 1.5, 74, 2};
    Exibe(fusca);
 
    return 0;
}




Até aqui tudo ok, pois apenas lemos os membros de uma struct...se quisermos alterar os membros de uma estrutura, a coisa muda um pouco, conforme veremos no próximo tutorial de C.

4 comentários:

Javier Andrés Gamboa Duarte disse...

Boas!!
Estou a fazer um programa para a faculdade da gestão de um hotel, mas tenho um problema com struct aninhadas.

typedef struct
{
int dia;
int mes;
int ano;
}DATA;

typedef struct
{
char nome[50];
int codigo;
int n_quartos;
DATA chegada[11]; // Inserir no formato aaaa-mm-dd
int n_noites;
float preco;
}RESERVA;

Como faco para por o DATA de chegada, mas que esta data fique com int dia, int mes, int ano de tipo DATA definidos. Até agora como podem reparar a chegada esta como um vetor, e para recever os dados da struct RESERVA estou a fazer isto:

int Fazer_Reserva(RESERVA *x)
{
int n;
system ("cls");
for(n=1;n");
getch();
return(1);
}
}
}

É lógico que já tenho definida uma tabela RESERVA reservasHotel[4000], desde onde se faz a chamada à funcao Fazer_Reserva()

Também parabéns pelo site esta mesmo bom e tem-me ajudado muito.

Anônimo disse...

Javier poderia colocar o enunciado do exercício para que eu possa lhe ajudar.

Anônimo disse...

#include

typedef struct aluno{
int matricula;
float vNotas[5];
char nome[50];
}a1;
struct disciplina{
int n;
int V[100];
int Nalunos;
}n;
typedef struct aluno aluno;

aluno fillaluno(aluno, a1){
printf ("Digite a matricula desse aluno:");
scanf ("%d", &a1.matricula);
printf("Digite a nota desse aluno:");
scanf("%.1f", &a1.vNotas[1]);
printf("Digite o nome desse aluno:");
gets(a1.nome);

return (a1);
};

struct Disciplina filldisciplina (Disciplina d1, int numAlunos){

printf("Digite a quantidade de alunos");
scanf("%d", &numAlunos);
for (n = 0; n < numAlunos; n++){
printf("Digite o nome dos alunos");
gets(d1.V[n]);
fillaluno(a1);
}

return (numAlunos, d1);
};


void mostrarDisciplina(Disciplina d1){
filldisciplina(d1);
for (n = 0; n < numAlunos; n++);
printf("o nome dos alunos eh: %s", d1.V[n]);
printf("o numero de alunos matriculados no curso eh: %d", numAlunos);
}

int main(){
struct disciplina pc1[10];
printf("Digite o nome dos alunos:");
gets(pc1);
filldisciplina(d1);
fillaluno(a1);
mostrarDisciplina(void);
return 0;

}

Alguem pode me dizer o que tem de errado aqui?

JotaPe disse...

não entendi esse car na função, alguem pode me explicar?

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.