Me ajude por favor a resolver esse error: invalid conversion from 'int' to 'int' [-fpermissive]

1. Me ajude por favor a resolver esse error: invalid conversion from 'int' to 'int' [-fpermissive]

Vitor Hugo Moreira de Lacerda
ProgamadorAmador

(usa XUbuntu)

Enviado em 28/01/2020 - 00:25h

Olá eu ainda sou um amador em programação da linguagem c e c++, mas ao tenta fazer um algoritimo eu acabei de cair nesse erro ai error: invalid conversion from 'int' to 'int' [-fpermissive]. Se alguém puder me explicar como resolver esse erro seria de boa ajuda. Aqui em baixo deixarei o meu codigo de algoritmo.
#include <stdio.h>
#include <stdlib.h>

int main(){
int linhas,colunas,a1,a2,tam1,tam2;
int **matriz;

printf("Coloque um valor de linhas da matriz");
scanf("%d",&tam1);
printf("Coloque um valor de colunas da matriz");
scanf("%d",&tam2);
linhas = tam1;
colunas = tam2;

matriz = (int **) malloc(linhas * sizeof(int*));


for(a1 = 0;a1 < linhas;a1++){
matriz[a2] = (int*) malloc(colunas * sizeof(int));

}
for(a1 = 0;a1 < linhas;a1++){
matriz[a1] = tam1;
for(a2= 0; a2 < colunas;a2++){
matriz[a2] = tam2;
printf("%d",matriz[a1][a2]);
}
printf("\n");
}

return 0;
}



  


2. Re: Me ajude por favor a resolver esse error: invalid conversion from 'int' to 'int' [-fpermissive]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 28/01/2020 - 19:52h

ProgamadorAmador escreveu:

Olá eu ainda sou um amador em programação da linguagem c e c++, mas ao tenta fazer um algoritimo eu acabei de cair nesse erro ai error: invalid conversion from 'int' to 'int' [-fpermissive].


Acho que, na transcrição da mensagem de erro, faltou um asterisco em algum lugar ali, não?

Seria bom também você transcrever o pedaço da mensagem de erro que diz qual linha de código provocou o erro, para facilitar para a gente, aqui.

Se alguém puder me explicar como resolver esse erro seria de boa ajuda. Aqui em baixo deixarei o meu codigo de algoritmo.
#include <stdio.h>
#include <stdlib.h>

int main(){


Em C, a declaração de main() deve ter uma das seguinte formas:

  • Caso, você não queira que o programa receba argumentos do sistema operacional:
int main(void) 

  • Caso você queira receber argumentos do sistema operacional (na forma de um array de strings com argc elementos, armazenados em argv[0] até argv[argc-1]):
int main(int argc, char **argv) 


int linhas,colunas,a1,a2,tam1,tam2;
int **matriz;

printf("Coloque um valor de linhas da matriz");
scanf("%d",&tam1);
printf("Coloque um valor de colunas da matriz");
scanf("%d",&tam2);
linhas = tam1;
colunas = tam2;


Essa leitura em variáveis temporárias seguida de uma transferência de valores para as variáveis definitivas não é necessária. Você pode fazer diretamente “scanf("%d", &linhas)” e “scanf("%d", &colunas)”, e eliminar as variáveis tam1 e tam2 do programa.

matriz = (int **) malloc(linhas * sizeof(int*)); 


Aqui não há erro, mas eu acho que você pode simplificar essa maneira de fazer, eliminando ou substituindo informações e conversões explícitas de tipo.

A conversão do valor retornado por malloc() não é necessária, pois tal valor é do tipo void *, que o compilador converte automaticamente em qualquer outro tipo de ponteiro. Ao explicitar essa conversão, você introduz no programa um lugar a mais em que pode haver erros, mesmo que por por distração ou por um tropeço no momento da digitação.

(Se você colocou essa conversão por estar usando um compilador de C++ para compilar seu código, uma vez que não existe essa conversão automática em C++, então deveria ou mudar o modo de compilação de C++ para C, ou usar uma das maneiras do C++ de lidar com alocação memória, quer pelo uso dos operadores new/delete e new[]/delete[], quer através de uma classe de containers, tal como std::vector ou std::list).

Eu sugiro também trocar o “sizeof(int*)” por uma outra forma, em que o próprio compilador infere o tipo do dado a partir do tipo associado ao elemento apontado. Fazendo desse modo, você só precisa saber qual é o nome do ponteiro, e deixa o trabalho de explicitar seu tipo para o compilador.

No caso do seu programa, eis como eu recomendo que você faça.

matriz=malloc(linhas*sizeof matriz[0]);
// ^^^ ^^^^^^^^^
// ||| |||||||||
// ||| +++++++++--- sizeof é aplicada sobre um dos elementos da região alocada (no caso, o primeiro, mas todos têm o mesmo tamanho)
// |||
// +++--- não precisa da conversão de tipo


for(a1 = 0;a1 < linhas;a1++){
matriz[a2] = (int*) malloc(colunas * sizeof(int));
}


Aqui o erro foi que você usou a1 como variável de controle do laço de repetição, mas na hora de alocar o elementos de cada linha, aplicou a2 como índice da linha da matriz.

Eu sugiro que, além de corrigir isso, você use nomes de variáveis que facilitem o diagnóstico dessa situação. Em vez de a1 e a2, algo como lin e col, l (letra L minúscula) e c, ou mesmo i e j, que são os índices normalmente usado com matrizes em livros-textos de Matemática.

Além disso, aqui também cabe usar a notação em que, em lugar de explicitar o tipo de cada elemento, você repete o identificador do objeto que vai receber o ponteiro, e indica um dos elementos a partir deles referenciado, como mostra o exemplo abaixo.

for(l=0; l<linhas; ++l)
matriz[l]=malloc(colunas*sizeof matriz[l][0]);


for(a1 = 0;a1 < linhas;a1++){
matriz[a1] = tam1;


Provavelmente você recebeu erro aqui, pois essa atribuição não faz sentido. O tipo de cada elemento matriz[a1] é int * (ponteiro para valor do tipo int), e, portanto, não faz sentido querer atribuir um valor inteiro (pois o tipo de tam1 é int) a um elemento cujo tipo é ponteiro (e mesmo que isso fosse possível, o efeito resultante seria que você substituiria o ponteiro para elementos de cada linha, que você alocou imediatamente acima).

for(a2= 0; a2 < colunas;a2++){
matriz[a2] = tam2;


Mesma coisa aqui, mas aqui parece ser mais grave um pouco porque, ao mudar o nome da variável, parece que você imaginou que estaria percorrendo as colunas, e não mais as linhas, o que não é verdade.

Você declarou matriz como “int **matriz”. Isso significa que matriz é do tipo “ponteiro para (um ou mais) dado(s) do tipo ‘ponteiro para (um ou mais) dado(s) do tipo int’”. Após a declaração, toda vez que aparece no código “matriz”, o que se tem é a designação desse ponteiro para dado(s) ponteiro para dado(s) int. Se você aplicar um operador de acesso a elemento, tal como em “matriz[n]” (sendo n inteiro) ou “*matriz” (que é sinônimo de “matriz[0]”; na verdade, “matriz[n]” é sinônimo de “*(matriz+n)”), você obtém um elemento que tem o tipo “ponteiro para dado(s) do tipo int”, e cada um desses ponteiros, no seu caso, representa uma linha inteira.

Outra maneira de pensar é entender o que cada tipo de dados representa. No seu caso, a matriz é um vetor de linhas, e cada linha é um vetor de elementos inteiros (e como tais vetores são alocados dinamicamente, cada um deles é referido por meio de ponteiros). Nessa organização de dados, portanto, colunas não são um atributo do objeto matriz, mas uma abstração (neste contexto, que não têm um correspondente direto em nenhum elemento sintático da linguagem) que se refere aos elementos que têm o mesmo índice em cada uma das linhas.

O compilador, portanto, não tem como entender que deveria entregar uma coluna em vez de uma linha só porque você mudou o nome da variável utilizada como índice. O que ele entende é quais são os tipos de dados envolvidos nas operações, como eles interagem entre si por meio dessas operações, e qual o tipo de dados do resultado das operações combinadas. Cuidar de que tais operações façam sentido é a parte humana do trabalho.

  printf("%d",matriz[a1][a2]);
}
printf("\n");
}

return 0;
}




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






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts