How do I pass a struct vector by reference parameter?

Asked

Viewed 2,134 times

1

(1) In the checar_poll function it is not printing the correct values I am reading in the ler_data function, it is printing a lot of numbers and random symbols. (2) If you solve the problem, how can I print all the polls already made?Erro

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
typedef struct
{
char nome[10],sexo[10],estado_civil[12],grau[12],canal[10];
int idade,horario;
} ENQUETE;
int main()
{
setlocale(LC_ALL,"portuguese");
ENQUETE ler[10];
int i=0,opcao;
printf("\n-------------------- ENQUETE IBOPE --------------------\n");
while(1)
{
    menu();
    printf("\n Opção: ");
    scanf("%d",&opcao);
    if (opcao == 3) break;
    switch(opcao)
    {
    case 1:
        ler_dados(&ler[i]);
        break;
    case 2:
        checar_enquete(ler[i]);
        break;
    case 3:
        return 0;
        break;
    }
  i=i+1;
}
}
void menu()
{
printf("\n----------------------- MENU --------------------------\n");
printf("\n Digite 1 para realizar uma nova enquete\n");
printf("\n Digite 2 para Checar as enquetes\n");
printf("\n Digite 3 para SAIR\n");
}
void ler_dados(ENQUETE *read)
{
fflush(stdin);
printf("\n Digite o Nome: ");
gets(read->nome);
printf("\n Digite a idade: ");
scanf("%d",&read->idade);
fflush(stdin);
printf("\n Digite o sexo(Masculino,Feminino ou Outro): ");
gets(read->sexo);
printf("\n Digite o Estado Civil(Solteiro,Casado,Viúvo ou Divorciado): ");
gets(read->estado_civil);
printf("\n Digite o Grau de Instrução(Fundamental,Médio,Superior,\n Mestrado 
ou Doutorado): ");
gets(read->grau);
printf("\n Digite o Horário da entrevista: ");
scanf("%d",&read->horario);
fflush(stdin);
printf("\n Digite o Canal(Globo,Band ou SBT): ");
gets(read->canal);
}

void checar_enquete(ENQUETE read)
{
int j=1,i=0;
printf("\n-------------------- ENQUETES %d --------------------------\n",j);
printf("\n Nome: %s",read.nome);
printf("\n Idade: %d",read.idade);
printf("\n Sexo: %s",read.sexo);
printf("\n Estado Civil: %s",read.estado_civil);
printf("\n Grau de Instrução: %s",read.grau);
printf("\n Horário da Entrevista: %d",read.horario);
printf("\n Canal: %s",read.canal);
printf("\n------------------------------------------------------------------
-\n");
}
  • &variavel from the calling side, tipo *parametro in signing the function

1 answer

0


int main()
{
setlocale(LC_ALL,"portuguese");
ENQUETE ler[10];
int i=0,opcao;
printf("\n-------------------- ENQUETE IBOPE --------------------\n");
do {
    menu();
    printf("\n Opção: ");
    scanf("%d",&opcao);
    if (opcao == 3) break;
    switch(opcao)
    {
    case 1:
        ler_dados(&ler[i]);
        i=i+1;
        break;
    case 2:
        checar_enquete(ler, i);
        break;
    case 3:
        return 0;
        break;
    }
} while (opcao != 3);
}


void ler_dados(ENQUETE *read)
{
printf("\n Digite o Nome: ");
scanf("%s", read->nome);fflush(stdin);
printf("\n Digite a idade: ");
scanf("%d", &read->idade);fflush(stdin);
printf("\n Digite o sexo(Masculino,Feminino ou Outro): ");
scanf("%s", read->sexo);fflush(stdin);
printf("\n Digite o Estado Civil(Solteiro,Casado,Viúvo ou Divorciado): ");
scanf("%s", read->estado_civil);fflush(stdin);
printf("\n Digite o Grau de Instrução(Fundamental,Médio,Superior,\n Mestrado ou Doutorado): ");
scanf("%s", read->grau);fflush(stdin);
printf("\n Digite o Horário da entrevista: ");
scanf("%d",&read->horario);fflush(stdin);
printf("\n Digite o Canal(Globo,Band ou SBT): ");
scanf("%s", read->canal);fflush(stdin);
}

void checar_enquete(ENQUETE read[10], int j)
{
    int i = 0;

    while (i < j) {
printf("\n-------------------- ENQUETES %d --------------------------\n",i);
printf("\n Nome: %s",read[i].nome);
printf("\n Idade: %d",read[i].idade);
printf("\n Sexo: %s",read[i].sexo);
printf("\n Estado Civil: %s",read[i].estado_civil);
printf("\n Grau de Instrução: %s",read[i].grau);
printf("\n Horário da Entrevista: %d",read[i].horario);
printf("\n Canal: %s",read[i].canal);
printf("\n-------------------------------------------------------------------\n");
i++;
}
}

Some considerations and a possible solution to your problem:

  • it is not a good practice to use fgets because it brings security problems by not limiting the size of the data entry;

  • your method of reading was correct with the &;

  • I modified your check method to go through the vector and show all registered.

  • But for me to read the struct data within the function, I have to go through the &, without it is not possible. And when I do it the same way,

  • When it comes to a vector, & is not used because it works internally with pointers (the address is already passed to be able to access the next memory positions within the function). But when it comes to a simple variable (not vector), & is used to pass the memory address of the variable. In short, when it’s vector, it doesn’t put the &.

  • Pay attention to the values expected by the functions ler_dados and checar_enquete. To ler_dados expecting a ENQUETE* soon it is correct to pass &ler[i]

  • You’re right, @Isac. I’ll adjust his code here in the answer.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.