Erro no programa C: warning: assignment from incompatible pointer type[enable by default] [RESOLVIDO

1. Erro no programa C: warning: assignment from incompatible pointer type[enable by default] [RESOLVIDO

Ernandes Souza
ErnandesSouza

(usa Linux Mint)

Enviado em 09/04/2016 - 22:08h

O programa completo tem como objetivo armazenar em lista encadeada dados como nome, sobrenome e cpf. A função abaixo recebe a lista, um nome, um sobrenome e cpf e armazenar na lista. Mas está dando um erro nesta função, o erro está no "else" do código abaixo, mais precisamente nas linhas "aux = aux -> prox;" e "aux -> prox = novo;".

Erro: warning: assignment from incompatible pointer type[enable by default]

no * adiciona_novo (no **lista, char nome[20], char sobrenome[30], int cpf)
{
no *novo, *aux;

novo = (no *) malloc (sizeof (no));
if (novo == NULL)
{
puts ("Falta memoria, nao houve alocacao\n");
exit (1);
}

novo -> nome[20] = nome[20];
novo -> sobrenome[30] = sobrenome[30];
novo -> cpf = cpf;
novo -> prox = NULL;

/* Verifica se a lista está vazia */
if (lista == NULL) //**** Se vazia
{
*lista = novo;
}
else //***************** Se não vazia
{
aux = *lista;

do
{
aux = aux -> prox;
} while(aux -> prox != NULL);
aux -> prox = novo;
}

return *lista;
}


(não tá dando pra mandar ele indentado, desculpem. )


  


2. Re: Erro no programa C: warning: assignment from incompatible pointer type[enable by default]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/04/2016 - 23:17h

ErnandesSouza escreveu:

O programa completo tem como objetivo armazenar em lista encadeada dados como nome, sobrenome e cpf. A função abaixo recebe a lista, um nome, um sobrenome e cpf e armazenar na lista. Mas está dando um erro nesta função, o erro está no "else" do código abaixo, mais precisamente nas linhas "aux = aux -> prox;" e "aux -> prox = novo;".

Erro: warning: assignment from incompatible pointer type[enable by default]

no * adiciona_novo (no **lista, char nome[20], char sobrenome[30], int cpf) 


Os argumentos nome e sobrenome, apesar da forma como estão declarados, que parece indicar que são arrays, na verdade são meros ponteiros de caracteres. Em outras palavras, não é possível passar arrays diretamente para funções, e qualquer tentativa de o fazer provoca a conversão do suposto array em ponteiro.

Outra coisa: se você considera CPF como inteiro, está desprezando os dígitos verificadores? Pergunto isso porque o CPF completo tem onze dígitos (9+2), e um inteiro com 32 bits não tem precisão para guardar onze dígitos.

	{
no *novo, *aux;

novo = (no *) malloc (sizeof (no));


Em C, essa conversão de tipo de ponteiro é desnecessária.

NOTA:
Em C++, essa conversão seria necessária, mas aí haveria outras considerações:

1) alocação em C++ se faz preferivelmente com o operador new, em vez da função malloc(); e

2) a conversão de tipo ao estilo de C é altamente depreciada, porque pode mascarar erros crassos; a segunda opção (se você não usar new) seria usar a forma abaixo.

novo=static_cast<no *>(malloc(sizeof(no)) 


	if (novo == NULL)
{
puts ("Falta memoria, nao houve alocacao\n");
exit (1);
}

novo -> nome[20] = nome[20];
novo -> sobrenome[30] = sobrenome[30];


Não é assim que se copiam strings em C. O que você disse acima provoca, na verdade, a cópia do 21º elemento (pois os índices começam a ser contados de 0, não de 1) de nome para o 21º elemento de novo->nome, e do 31º elemento de sobrenome para o 31º elemento de novo->sobrenome.

Para copiar strings, use a função strncpy().

	novo -> cpf = cpf;
novo -> prox = NULL;

/* Verifica se a lista está vazia */
if (lista == NULL) //**** Se vazia
{
*lista = novo;
}
else //***************** Se não vazia
{
aux = *lista;

do
{
aux = aux -> prox;
} while(aux -> prox != NULL);
aux -> prox = novo;
}

return *lista;
}


(não tá dando pra mandar ele indentado, desculpem. )


Para formatar código no VoL, coloque-o entre as tags [code] e [/code].

Com relação ao seu erro, você teria de mostrar a declaração da sua estrutura. O erro indicado sugere que você não declarou o campo prox com um tipo compatível com “no *”.


3. Re: Erro no programa C: warning: assignment from incompatible pointer type[enable by default] [RESOLVIDO

Ernandes Souza
ErnandesSouza

(usa Linux Mint)

Enviado em 11/04/2016 - 14:36h

paulo1205 escreveu:

ErnandesSouza escreveu:

O programa completo tem como objetivo armazenar em lista encadeada dados como nome, sobrenome e cpf. A função abaixo recebe a lista, um nome, um sobrenome e cpf e armazenar na lista. Mas está dando um erro nesta função, o erro está no "else" do código abaixo, mais precisamente nas linhas "aux = aux -> prox;" e "aux -> prox = novo;".

Erro: warning: assignment from incompatible pointer type[enable by default]

no * adiciona_novo (no **lista, char nome[20], char sobrenome[30], int cpf) 


Os argumentos nome e sobrenome, apesar da forma como estão declarados, que parece indicar que são arrays, na verdade são meros ponteiros de caracteres. Em outras palavras, não é possível passar arrays diretamente para funções, e qualquer tentativa de o fazer provoca a conversão do suposto array em ponteiro.

Outra coisa: se você considera CPF como inteiro, está desprezando os dígitos verificadores? Pergunto isso porque o CPF completo tem onze dígitos (9+2), e um inteiro com 32 bits não tem precisão para guardar onze dígitos.

	{
no *novo, *aux;

novo = (no *) malloc (sizeof (no));


Em C, essa conversão de tipo de ponteiro é desnecessária.

NOTA:
Em C++, essa conversão seria necessária, mas aí haveria outras considerações:

1) alocação em C++ se faz preferivelmente com o operador new, em vez da função malloc(); e

2) a conversão de tipo ao estilo de C é altamente depreciada, porque pode mascarar erros crassos; a segunda opção (se você não usar new) seria usar a forma abaixo.

novo=static_cast<no *>(malloc(sizeof(no)) 


	if (novo == NULL)
{
puts ("Falta memoria, nao houve alocacao\n");
exit (1);
}

novo -> nome[20] = nome[20];
novo -> sobrenome[30] = sobrenome[30];


Não é assim que se copiam strings em C. O que você disse acima provoca, na verdade, a cópia do 21º elemento (pois os índices começam a ser contados de 0, não de 1) de nome para o 21º elemento de novo->nome, e do 31º elemento de sobrenome para o 31º elemento de novo->sobrenome.

Para copiar strings, use a função strncpy().

	novo -> cpf = cpf;
novo -> prox = NULL;

/* Verifica se a lista está vazia */
if (lista == NULL) //**** Se vazia
{
*lista = novo;
}
else //***************** Se não vazia
{
aux = *lista;

do
{
aux = aux -> prox;
} while(aux -> prox != NULL);
aux -> prox = novo;
}

return *lista;
}


(não tá dando pra mandar ele indentado, desculpem. )


Para formatar código no VoL, coloque-o entre as tags [code] e [/code].

Com relação ao seu erro, você teria de mostrar a declaração da sua estrutura. O erro indicado sugere que você não declarou o campo prox com um tipo compatível com “no *”.





A estrutura é essa:

typedef struct No
{
char nome[20];
char sobrenome[30];
int cpf;

no *prox;
} no;



4. Resolvido

Ernandes Souza
ErnandesSouza

(usa Linux Mint)

Enviado em 15/04/2016 - 10:05h

a declaração correta da estrutura seria:

typedef struct No
{
char nome[20];
char sobrenome[30];
int cpf;

struct No *prox;
} no;


e não:

typedef struct No
{
char nome[20];
char sobrenome[30];
int cpf;

no *prox;
} no;







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts