Ir ao conteúdo
  • Cadastre-se

"incompatible pointer type" usando ponteiro como parâmetro de função


Irio

Posts recomendados

Estive estudando só Pascal por mais de um ano pelo técnico, então pelo jeito estou bem enferrujado em C.

http://pastebin.com/G9wtZwUt

Preciso passar um ponteiro como parâmetro e uma função. Apesar de tudo funcionar, recebo os seguintes "Warning":


In function `main':
80 [Warning] passing arg 2 of `criaMatriz' from incompatible pointer type
82 [Warning] passing arg 2 of `adicionaDado' from incompatible pointer type
83 [Warning] passing arg 1 of `mostraMatriz' from incompatible pointer type
88 [Warning] passing arg 1 of `limpaMatriz' from incompatible pointer type

Penso que possa ser porque aloquei o tamanho da matriz inteira (linha 17); e quando passo como parâmetro, digo que é int.

Alguém tem ideia do que pode ser?

(Usando Dev-C++ 4.9.9.2)

Link para o comentário
Compartilhar em outros sites

O erro está na hora de passar o "mat_original" como parâmetro.

Essa variável já é um ponteiro para "int", logo, você não pode colocar o "&" na frente, se não, você estará passando o ponteiro do ponteiro.

Função main:


int main (void) {
ordem = 5;
criaMatriz (ordem, mat_original);
for (i=1; i<=(ordem*ordem); i++)
adicionaDado (i, mat_original);
mostraMatriz (mat_original);
/*printf ("\n %d \n", somaPrincipal(&mat_original));
getchar ();*/
/*inverteMatriz (&mat_original, &mat_invertida);
mostraMatriz (&mat_invertida);*/
limpaMatriz (mat_original);
return 0;
}

Link para o comentário
Compartilhar em outros sites

O erro está na hora de passar o "mat_original" como parâmetro.

Essa variável já é um ponteiro para "int", logo, você não pode colocar o "&" na frente, se não, você estará passando o ponteiro do ponteiro.

Função main:


int main (void) {
ordem = 5;
criaMatriz (ordem, mat_original);
for (i=1; i<=(ordem*ordem); i++)
adicionaDado (i, mat_original);
mostraMatriz (mat_original);
/*printf ("\n %d \n", somaPrincipal(&mat_original));
getchar ();*/
/*inverteMatriz (&mat_original, &mat_invertida);
mostraMatriz (&mat_invertida);*/
limpaMatriz (mat_original);
return 0;
}

É, faz sentido isso mesmo. Mas depois dessa modificação, o programa trava ao ser executado (sem chegar a mostrar nada do que é pedido).

De acordo com meu debug, deu segmentation fault quando iria adicionar um novo dado (a matriz não chegou a ser alocada ou não foi gravada a posição; valia "0x0").

(Código modificado)

Link para o comentário
Compartilhar em outros sites

O erro de segmentation fault ocorre porque o sistema está tentando acessar uma área de memória que não foi pré-alocada.

A função "criaMatriz" recebe um ponteiro para "matriz", e então aloca memória para ela, só que, essa memória é perdida quando o função é terminada.

Para que essa memória não se perca, precisa-se passar como parametro "**matriz" (ponteiro do ponteiro).

Assim:


int criaMatriz (int tamanho, int **matriz) {
*(matriz) = malloc (tamanho*tamanho * sizeof(int));
if (matriz == NULL) {
printf ("Impossivel alocar memoria para a matriz. Fechando o programa...");
getchar ();
exit (1);
}
return 0;
}

E lá na função main, precisa (agora sim) colocar o "&" na frente do parâmetro.


int main (void) {
ordem = 5;
criaMatriz (ordem, &mat_original);
for (i=1; i<=(ordem*ordem); i++)
adicionaDado (i, mat_original);
mostraMatriz (mat_original);
/*printf ("\n %d \n", somaPrincipal(&mat_original));
getchar ();*/
/*inverteMatriz (&mat_original, &mat_invertida);
mostraMatriz (&mat_invertida);*/
limpaMatriz (mat_original);
return 0;
}

Depois que fiz isso, o programa mostrou a matriz na tela.

Link para o comentário
Compartilhar em outros sites

O erro de segmentation fault ocorre porque o sistema está tentando acessar uma área de memória que não foi pré-alocada.

A função "criaMatriz" recebe um ponteiro para "matriz", e então aloca memória para ela, só que, essa memória é perdida quando o função é terminada.

Para que essa memória não se perca, precisa-se passar como parametro "**matriz" (ponteiro do ponteiro).

Assim:


int criaMatriz (int tamanho, int **matriz) {
*(matriz) = malloc (tamanho*tamanho * sizeof(int));
if (matriz == NULL) {
printf ("Impossivel alocar memoria para a matriz. Fechando o programa...");
getchar ();
exit (1);
}
return 0;
}

E lá na função main, precisa (agora sim) colocar o "&" na frente do parâmetro.


int main (void) {
ordem = 5;
criaMatriz (ordem, &mat_original);
for (i=1; i<=(ordem*ordem); i++)
adicionaDado (i, mat_original);
mostraMatriz (mat_original);
/*printf ("\n %d \n", somaPrincipal(&mat_original));
getchar ();*/
/*inverteMatriz (&mat_original, &mat_invertida);
mostraMatriz (&mat_invertida);*/
limpaMatriz (mat_original);
return 0;
}

Depois que fiz isso, o programa mostrou a matriz na tela.

Muito obrigado pela ajuda mesmo. Alterei mais duas linhas além disso e agora funciona perfeitamente. Para quem se interessar, aí está o código final:

http://pastebin.com/eD91J1x8

As linhas que alterei além das de definição dos parâmetros, foram a 29 e 52, porque como estaríamos lidando com um ponteiro de outro ponteiro, quando queremos saber o valor "final" do ponteiro matriz, teríamos que usar **matriz. Funciona também, mas dá a seguinte mensagem nas linhas citadas:


[Warning] assignment makes pointer from integer without a cast

Logo, precisei dizer novamente o tipo do valor do ponteiro mat_original: (int *).

PS.: No fim, reli o enunciado do exercício pedido pelo professor. Era para ter feito usando uma lista encadeada, não usando um espaço alocado sequencialmente na memória. Mas de qualquer jeito, ajudou um monte, mesmo.

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!