Erro em struct [RESOLVIDO]

1. Erro em struct [RESOLVIDO]

Lucas jose Pereia de Araujo
LucasJPA

(usa Debian)

Enviado em 06/12/2019 - 16:08h

Boa tarde, estou fazendo um exemplo simples para entender um struct de structs, meu objeto e criar um vetor ou uma lista de strcuts. porem este erro aparece
estruturateste.c: In function ‘main’:
estruturateste.c:35:20: error: invalid application of ‘sizeof’ to incomplete type ‘tlista {aka struct lista_cliente}’
l = malloc(sizeof(tlista));
^~~~~~
estruturateste.c:49:8: error: dereferencing pointer to incomplete type ‘tlista {aka struct lista_cliente}’
l->clientes.codigo = codigo;


aqui esta o código
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdio_ext.h>


struct cliente
{
unsigned int codigo;
char nome[41];
char cpf[11];
//struct cliente *prox;
};
typedef struct cliente TCliente;

struct lista_clientes
{
int capacidade;
int num_cliente;
TCliente *clientes;
};
typedef struct lista_cliente tlista;



int main()
{
char op;
tlista *l;

unsigned int codigo;
char nome[41];
char cpf[14];

l = malloc(sizeof(tlista));

if(l == NULL)
{
printf("Erro, possivel falta de memoria\n\n");
//return -1;
}

do
{
printf("\nCadastrar:\n");

printf("\n\nCodigo: ");
scanf("%u", &codigo);
l->clientes.codigo = codigo;

printf("\n\nNome: ");
fflush(stdin);
fgets(nome, 41, stdin);
strcpy(l->clientes.nome, nome);

printf("\n\nCPF: ");
fflush(stdin);
fgets(cpf, 14, stdin);
strcpy(l->clientes.cpf, cpf);

printf("\n\nContinua [S/N] ?");
scanf(" %c", &op);
}while(op == 'S' || op == 's');

__fpurge(stdin);




return 0;
}


qualquer ajuda é bem vinda, e desde ja obrigado.


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/12/2019 - 20:55h

O problema é que você diz que tlista é um apelido de struct cliente, que você não declarou em nenhuma parte do seu código. Provavelmente você quis dizer que o apelido se refere a struct clientes (com um s no final), que foi o que você declarou (ou talvez você preferia remover o s da declaração original).

Dito onde estava o erro, convém entender a causa.

Em C, quando você diz, em qualquer parte do programa, algo como “struct S” ou “union U”, o compilador vai consultar seus dados internos para saber se já existe uma estrutura ou união com o referido rótulo (no nosso exemplo, “S” ou “U”, respectivamente). Se não existir, ele vai colocar esses rótulos numa lista de nomes de rótulos conhecidos (ou declaradas), mesmo que a estrutura ou a união associadas a tais rótulos ainda não tenham sido definidas (isto é: todos os campos plenamente conhecidos e especificados). Em outras palavras, a declaração de uma estrutura ou união pode ocorrer implicitamente quando ela é mencionada pela primeira vez, não requerendo declarações explícitas.

Um tipo declarado mas ainda não conhecido é chamado pelo C de um tipo incompleto. Tipos incompletos são particularmente úteis quando você está trabalhando com ponteiros para estruturas, e mais úteis ainda quando você não deseja que o usuário conheça detalhes internos dos objetos aos quais tais ponteiros se referem. O tipo FILE da biblioteca padrão do C seguramente é uma estrutura, mas só sabe o que vai dentro dela quem cuida da implementação da biblioteca padrão; para nós, que apenas a utilizamos, FILE é um tipo incompleto.

Entretanto, para criar objetos (e não simplesmente ponteiros para objetos) de um determinado tipo ou para saber seu tamanho, seu tipo não pode ser incompleto, mas tem de ter sido completamente definido.

Então, recapitulando de maneira detalhada, o problema com seu programa é que, na linha em que você disse “typedef struct lista_cliente tlista;”, você declarou implicitamente um tipo incompleto com “struct lista_cliente”, uma vez que o rótulo lista_cliente não se referia a nenhum tipo completo que já fosse conhecido, e depois criou o apelido tlista para esse tipo incompleto — o que é perfeitamente válido — e, em seguida, na linha 35, tentou calcular o tamanho de um dado desse tipo e, na linha 49, tentou acesso a um campo desse objeto cujo conteúdo é desconhecido.


... “Principium sapientiae timor Domini, et scientia sanctorum prudentia.” (Proverbia 9:10)





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts