Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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.

Editado por CiroboyBR
  • 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. 

 

Editado por giu_d
Erro na explicação

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 :)

 

Editado por giu_d
Correção no código

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 

Editado por giu_d

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






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

×