Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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.

9 comentários:

Unknown 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?

Anônimo disse...

Como faço para minha função ler os dados de uma struct??
Tenho que fazer um programa que gerencia um hotel e cadastrar um hospede em determinado quarto da escolha dele, fiz uma struct de cliente e outra para quartos, e tenho que mostrar o registro dos quartos e o registro de clientes cadastrados, então fiz duas funçoes que deveriam fazer isso,mas quando coloco
puts(qrt[j].nomehospede),que deveria mostrar o nome do hospede cadastrado no quarto j, mostra uns simbolos doidos.
Tentei fazer da forma indicada acima e não funcionou.
estou usando o code::blocks para fazer o programa.

monia tavares disse...

aqui tem um modelo simples que eu fiz sobre a passagem de função usando structs
sem o atalho typedef.

#include

struct carros
{
int modelo,ano;


}carro;

void exibe(struct carros car)
{
printf("modelo: %i\n ",car.modelo);
printf("ano: %i",car.ano);


}


int main(void)

{
struct carros fusca= {5, 74};
exibe(fusca);

}

é so um modelinho simples, mas mostra que tanto com a typedef , ou sem, a passagem é sempre valida, aí é o programador que escolhe hehehe

JotaPe disse...

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

Vinicius disse...

"car" recebe o endereço de "fusca".

joao disse...

E como é que faz quando a função tá numa biblioteca e chama no programa principal?

Anônimo disse...

Oi Anônimo tudo bem,
Sou novo nessa área e tenho um trabalho para a faculdade e não faço a menor ideia como montar pode me ajudar?
Segue o enunciado.
Faça um programa em linguagem C que manipule uma estrutura chamada Veículo. A estrutura deve ter os campos marca, modelo, nome do proprietário, tamanho do tanque de combustível em litros. Faça 2 rotinas, uma para ler os dados do veículo, outra para mostrar seus dados. A função de leitura pode gerar os dados aleatoriamente se você preferir. Ou ainda preencha todas as entradas com valores constantes, escolhendo os dados de sua preferência.
Gerar um vetor com 50 registros para uma concessionaria. Faça então as seguintes funções de pesquisa:
•. Mostrar o nome do proprietário de todos os veículos de uma certa marca/modelo. Aproveite para contá-los também na mesma rotina.
•. Calcular quanto custa para encher o tanque de combustível, para cada veículo do vetor. O valor do litro do combustível pode ser dado por parâmetro. Calcule também o total gasto pela concessionária para encher todos os tanques.
Na função main(), faça:
• Carregar os 50 veículos.
• Chamar as funções de pesquisa.
• Mostrar todos os resultados.