assignment from incompatible pointer type [-Wincompatible-pointer-types] [RESOLVIDO]

1. assignment from incompatible pointer type [-Wincompatible-pointer-types] [RESOLVIDO]

Henrique Cesar
henriquecb

(usa Arch Linux)

Enviado em 05/10/2016 - 16:33h

Boa tarde, eu estou aprendendo sobre listas e decidi fazer uma simples implementação de uma para entender o seu funcionamento. Porém aparece esses erros

lista.c: In function ‘insere’:
lista.c:19:26: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
LISTA->ultima->proximo = (Celula*)malloc(sizeof(Celula));
lista.c:20:17: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
LISTA->ultima = LISTA->ultima->proximo;
lista.c: In function ‘exibe’:
lista.c:26:10: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
cont = LISTA.cabeca->proximo;
lista.c:29:12: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
cont = cont->proximo;
e eu nao sei o porquê. Alguem pode me ajudar?

estas sao as structs que eu estou usando
typedef struct {
int IDusuario;
char nomeUsuario[200];
}Usuario;
typedef struct{
Usuario perfil;
struct Celula *proximo;
}Celula;
typedef struct{
Celula *cabeca;
Celula *ultima;
}Lista;

e estas sao as funções cujo erro aparece
void insere(Lista *LISTA, Usuario novo) {
LISTA -> ultima -> proximo = (Celula*)malloc(sizeof(Celula));
LISTA -> ultima = LISTA -> ultima -> proximo;
LISTA -> ultima -> perfil = novo;
LISTA -> ultima -> proximo = NULL;
}
void exibe(Lista LISTA) {
Celula *cont;
cont = LISTA.cabeca -> proximo;
while(cont != NULL) {
printf("%i\n",cont->perfil.IDusuario);
cont = cont- > proximo;
}
}




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 05/10/2016 - 17:16h

Em vez de

typedef struct{
Usuario perfil;
struct Celula *proximo;
}Celula;


você deveria ter dito o seguinte:

typedef struct Celula {
Usuario perfil;
struct Celula *proximo;
}Celula;


Explicação: em C, nomes de tipos e símbolos residem num espaço diferente dos rótulos de estruturas, uniões e enumerações. Isso que permite a você ter, por exemplo, ter uma struct sigaction e uma função sigaction() (ambos em <signal.h>) ao mesmo tempo, ou uma struct Celula e um tipo Celula (via typedef) ao mesmo tempo.

O problema com o primeiro bloco de código é que a estrutura é declarada sem rótulo, dentro do comando typedef que associa o nome de tipo a essa estrutura anônima. O campo proximo não é um ponteiro para a estrutura anônima que está sendo definida, mas sim para uma estrutura com rótulo Celula, que é diferente da estrutura anônima à qual o campo pertence. Como o campo é um ponteiro, o C não exige que a estrutura tenha sido definida ainda -- aliás, você não a define em lugar nenhum.

Ate onde eu sei, não existe sintaxe possível para que um membro de estrutura anônima aponte para essa mesma estrutura anônima. O nome de tipo usado no typedef não serve, pois só estará definido ao final da declaração, e o campo aparece ao longo dessa mesma declaração. Logo você é obrigado a atribuir um rótulo à estrutura.





Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts