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)