Ir ao conteúdo
  • Cadastre-se
Yuri Carvalhgo

C Erro em lista de estruturas em C

Recommended Posts

Estou trabalhando em um código de lista de estruturas, onde tenho uma struct chamada cad que contém os campos matrícula, nome e salário. E uma lista contendo um campo do tipo struct cad que guarda os campos da struct cad em forma de lista. Portanto o código fica assim:

 

#define MAX 5

struct cad
{
    int mat;
    char nome[30];
    float sal;
};

struct lista
{
    int fim;
    struct cad memo[MAX];
};

typedef struct lista lista;
typedef struct cad cad;
int main()
{   lista l;
    cad x;
    int opc, pos;
    l.fim = -1;

do
{
    opc = menu();
    switch(opc)
    {
    case 1: //enfileirar
        if(l.fim==MAX-1)
            {
                printf("Lista Cheia ");
            } 
            else
            {
                printf("Matricula = ");
                scanf("%d", &x.mat);
                printf("Nome = ");
                fflush(stdin);
                gets(x.nome);
                printf("Salario = ");
                scanf("%f", &x.sal);
                inserir(&l, x);
            }
        break;

        case 2: //remover
            if(l.fim==-1)
            {
                printf("Lista vazia ");
            }
            else
            {
                x=remover(&l);
                printf("\n matricula = %d", x.mat);
                printf("\n nome = %s", x.nome);
                printf("\n salario = %f", x.sal);
            }
         break;

Porém ao criar uma função capaz de remover as informações em uma das posições de struct cad memo, me ocorre o erro de "incompatible types when assigning to type 'cad' from type 'int'|"

A função de remover ficou assim:

 

struct cad remover(lista *l)
{
    int i;
    struct cad aux;

    aux = l->memo[0];
    for(i=0;i<l->fim; i++)
    {
        l->memo[i] = l->memo[i+1];
    }
    l->fim--;
    return aux;
}

Alguém poderia me esclarecer o porque desse erro?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Yuri Carvalhgo Olá. Se não for difícil para você passar o código todo, com as funções inserir e menu, seria ótimo para dar uma resposta mais adequada

adicionado 5 minutos depois

Com algumas alterações aqui o código compilou. Por exemplo: na linha onde está dando esse erro q você citou, ficou assim:

x = remover(l);

Não é necessário o uso do & comercial para a chamada dessa função. No início do main ficaria assim:

Lista *l = NULL;

Mas sem ter acesso a todo o código fica difícil dar uma resposta mais precisa

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Aqui está o código inteiro, mesmo substituindo continuo com outro erro
veja só
 

//Yuri Carvalho
#include<stdio.h>
#include<stdlib.h>
#define MAX 5

struct cad
{
    int mat;
    char nome[30];
    float sal;
};

struct lista
{
    int fim;
    struct cad memo[MAX];
};

typedef struct lista lista;

int main()
{   lista l;
    struct cad x;
    int opc, pos;
    l.fim = -1;

do
{
    opc = menu();
    switch(opc)
    {
        case 1: //enfileirar
            if(l.fim==MAX-1)
            {
                printf("Lista Cheia ");
            }
            else
            {
                printf("Matricula = ");
                scanf("%d", &x.mat);
                printf("Nome = ");
                fflush(stdin);
                gets(x.nome);
                printf("Salario = ");
                scanf("%f", &x.sal);
                inserir(&l, x);
            }
        break;

        case 2: //remover
            if(l.fim==-1)
                printf("Lista vazia ");
            else
            {
                x = remover(l);
                printf("\n matricula = %d", x.mat);
                printf("\n nome = %s", x.nome);
                printf("\n salario = %f", x.sal);
            }
        break;

        case 3: //busca
            if(l.fim == -1)
                printf("Lista vazia ");
            else
            {
                printf("Entre com a matricula que deseja procurar ");
                scanf("%d", &x);
                pos = buscabin(l,x);
                if(pos == -1)
                    printf("Matricula nao encontrada ");
                else
                {
                    printf("\n Matricula encontrada na posicao %d", &pos);
                }
            }
        break;

        default: printf("Opcao invalida ");


            }

    } while(opc!=8);
}



void inserir (lista *l, struct cad x)
{
    l.final++;
    l->memo[l->final] = x;
}

struct cad remover(lista *l)
{
    int i;
    struct cad aux;
    aux = l->memo[0];
    for(i=0;i<l->final; i++)
    {
        l->memo[i] = l->memo[i+1];
    }
    l->final--;
    return aux;
}


int buscabin(lista l, int mat)
{
    int ini, fim, meio;
    ini = 0;
    fim = l.final;
    while(ini<=fim)
    {
        meio = (ini+fim)/2;
        if(mat = l.memo[meio].mat);
            return meio;
        if(mat<l.memo[meio].mat);
            fim = meio - 1;
        else
        {
            ini = meio + 1;
        }
    }
    return -1;
}


int menu()
{
    int opc;
    printf("\n 1- Inserir ");
    printf("\n 2- Remover ");
    printf("\n 3- Busca ");
    printf("\n 8 - Sair");
    printf("\n OPC =  ");
    scanf("%d", &opc);
    return opc;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

O protótipo da sua função:

int buscabin(lista l, int mat);

Lá pela linha 125 você tenta fazer isso:

pos = buscabin(l, x);

 

Porém a variável x é isso:

struct cad x;



Resumindo, sua função requer um inteiro, dê uma variável do tipo inteiro para ela, ou então mude o protótipo da função.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Yuri Carvalhgo Apenas para completar o q foi dito pelo @CiroboyBR  

Na linha anterior da chamada a função buscabin você definiu um scanf dessa forma:

 

printf("Entre com a matricula que deseja procurar ");
scanf("%d", &x); // aqui você está fazendo a leitura de x como se ele fosse um int

Só q como foi dito acima, x está definido dessa forma:

struct cad x;

Ao q parece você está demonstrando uma indecisão bastante grande, amigo.

Pode ser q você esteja um pouco confuso com relação ao uso de struct ou talvez dificuldade em trabalhar com listas, não sei o q pode estar acontecendo realmente

Seria interessante você repensar seu código e definir exatamente o q quer

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Yuri Carvalhgo Olá de novo. A questão é procurar resolver o problema por partes.

Na função buscabin você também deve fazer uso de um ponteiro do tipo lista como parâmetro, como vem fazendo nas outras funções. Então ficaria assim sua função:

 

int buscabin(lista *l, int mat)
{
    int ini, fim, meio;
    ini = 0;
    fim = l->fim;
    while(ini <= fim)
    {
        meio = (ini + fim) / 2;
        if (mat = l->memo[meio].mat)
            return meio;
        if (mat < l->memo[meio].mat)
            fim = meio - 1;
        else
        {
            ini = meio + 1;
        }
    }
    return -1;
}

O ponto q fica pendente é com respeito ao segundo parâmetro da função acima.

 

Outra dúvida: Na função inserir você faz uso de uma variável q chama de final, não seria fim não? Se é isso ficaria assim sua função:

 

void inserir (lista *l, struct cad x)
{
    l->fim++;
    l->memo[l->fim] = x;
}

Procura fazer essas alterações para ver se ajuda e aí posta aqui o q você conseguir resolver, ok?

 

adicionado 8 minutos depois

Outra sugestão q eu daria era mudar seu typedef, deixando ele assim:

 

typedef struct lista Lista;

E daí fazer as alterações necessárias. 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Yuri Carvalhgo Olá. Tenho boas notícias. Depois de mexer um tempo em seu código deu p fazer ele rodar.

Dá uma olhada para ver se é isso mesmo q você quer. É preciso resolver a questão da posição da matrícula. Já são quase 2 da madrugada e tenho q ir dormir hehe

Segue o código:

 

//Yuri Carvalho
#include <stdio.h>
#include <stdlib.h>

#define MAX 5

struct cad
{
    int mat;
    char nome[30];
    float sal;
};

struct lista
{
    int fim;
    struct cad memo[MAX];
};

typedef struct lista Lista;

// declaração das funções
void inserir (Lista *l, struct cad x);
struct cad remover(Lista *l);
int buscabin(Lista *l, int mat);
int menu();
void limpa_linha();

int main()
{
    Lista l;
    int opc, pos = 0;
    struct cad x;
    l.fim = -1;

    do
    {
        opc = menu();
        switch(opc)
        {
        case 1: //enfileirar
            if(l.fim == MAX - 1)
            {
                printf("Lista Cheia ");
            } else {

                printf("\nMatricula = ");
                scanf("%d", &x.mat);
                limpa_linha();

                printf("Nome = ");
                scanf("%[^\n]s", x.nome);
                limpa_linha();

                printf("Salario = ");
                scanf("%f", &x.sal);
                limpa_linha();
            }

            inserir(&l, x);

            break;
        case 2: //remover
            if(l.fim == -1)
            {
                printf("\nLista vazia!\n");
            }
            else
            {
                x = remover(&l);
                printf("\n matricula = %d", x.mat);
                printf("\n nome = %s", x.nome);
                printf("\n salario = %.2f\n\n", x.sal);
            }
            break;
        case 3: //busca
            if(l.fim == -1)
                printf("\nLista vazia!\n");
            else
            {
                printf("\nEntre com a matricula que deseja procurar: ");
                scanf("%d", &x.mat);
                pos = buscabin(&l, x.mat);
                if(pos == -1)
                    printf("\nMatricula nao encontrada");
                else
                {
                    printf("\nMatricula encontrada na posicao %d\n\n", pos);
                }
            }
            break;
        case 8:
            // sair
            break;
        default:
            printf("\nOpcao invalida\n\n");
            break;
        }

    } while(opc != 8);

    return 0;
}


void limpa_linha() {

    scanf("%*[^\n]");
    scanf("%*c");
}



void inserir (Lista *l, struct cad x)
{
    l->fim++;
    l->memo[l->fim] = x;
}

struct cad remover(Lista *l)
{
    int i;
    struct cad aux;
    aux = l->memo[0];
    for(i = 0; i < l->fim; i++)
    {
        l->memo[i] = l->memo[i+1];
    }
    l->fim--;
    return aux;
}


int buscabin(Lista *l, int mat)
{
    int ini, fim, meio;
    ini = 0;
    fim = l->fim;
    while(ini <= fim)
    {
        meio = (ini + fim) / 2;
        if (mat = l->memo[meio].mat)
            return meio;
        if (mat < l->memo[meio].mat)
            fim = meio - 1;
        else
        {
            ini = meio + 1;
        }
    }
    return -1;
}


int menu()
{
    int opc;
    printf("\n 1- Inserir ");
    printf("\n 2- Remover ");
    printf("\n 3- Busca ");
    printf("\n 8 - Sair");
    printf("\n OPC =  ");
    scanf("%d", &opc);
    return opc;
}

Vê se é isso mesmo. 

Mas creio q agora você vai saber onde é preciso fazer algum ajuste :)

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ficou a questão da posição da matrícula para resolver, q diz respeito a variável pos

Na opção Buscar indiferente do nº da matrícula q informe aparece q a matrícula foi encontrada 

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Cara, funcionou perfeitamente aqui, MUITO OBRIGADO!
A questão do ajuste na função buscar pode deixar comigo, obrigado mesmo!
Vou estudar meus erros agora

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Yuri Carvalhgo  Olá. Se puder postar o resultado assim q conseguir resolver a questão q ficou pendente agradeceria muito! Me empolguei com o seu código e gostaria de ver o mesmo funcionando 100% :)

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

@giu_d Olá. Estive dando uma nova olhada no código e me parece mais lógico trabalhar com um ponteiro do tipo Lista no main. Creio q seria interessante considerar isso. Para o uso de um ponteiro foi preciso fazer alocação dinâmica.

Com isso, o código no main ficou assim:

 

int main()
{
    Lista *l = NULL;
    int opc, pos;
    struct cad x;

    l = malloc(sizeof(Lista));

    l->fim = -1;

    do
    {
        opc = menu();
        switch(opc)
        {
        case 1: //enfileirar
            if(l->fim == MAX - 1)
            {
                printf("Lista Cheia ");
            } else {

                printf("\nMatricula = ");
                scanf("%d", &x.mat);
                limpa_linha();

                printf("Nome = ");
                scanf("%[^\n]s", x.nome);
                limpa_linha();

                printf("Salario = ");
                scanf("%f", &x.sal);
                limpa_linha();
            }

            inserir(l, x);

            break;
        case 2: //remover
            if(l->fim == -1)
            {
                printf("\nLista vazia!\n");
            }
            else
            {
                x = remover(l);
                printf("\n matricula = %d", x.mat);
                printf("\n nome = %s", x.nome);
                printf("\n salario = %.2f\n\n", x.sal);
            }
            break;
        case 3: //busca
            if(l->fim == -1)
                printf("\nLista vazia!\n");
            else
            {
                printf("\nEntre com a matricula que deseja procurar: ");
                scanf("%d", &x.mat);
                pos = buscabin(l, x.mat);
                if (pos == -1)
                    printf("\nMatricula nao encontrada");
                else
                {
                    printf("\nMatricula encontrada na posicao %d\n\n", pos);
                }
            }
            break;
        case 8:
            // sair
            break;
        default:
            printf("\nOpcao invalida!\n\n");
            break;
        }

    } while(opc != 8);

    free(l); // libera o ponteiro

    l = NULL; // faz o ponteiro voltar a apontar p nenhum lugar

    return 0;
}

O restante do código permanece o mesmo.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×