Não consigo fazer o segmento de programa abaixo compilar usando ponteiro. [RESOLVIDO]

1. Não consigo fazer o segmento de programa abaixo compilar usando ponteiro. [RESOLVIDO]

Marlisson Silva
marlisson.silva

(usa Ubuntu)

Enviado em 29/04/2015 - 20:39h

#include<stdio.h>
#include<stdlib.h>

int ordem_de_N(){
int ordem;

printf("Digite um valor de ordem para a Matriz, min = 1 e max = 10: ");
do{
scanf("%d", &ordem);
if(ordem<1 || ordem>10)
printf("Valor de ordem invalido. Por favor, digite um valor entre 1 e 10: ");
}while(ordem<1 || ordem>10);

return(ordem);
}

void le_matriz(int *matriz, int DIM){
int i,j;

printf("Agora preencha a Matriz com valores inteiros.\n\n");
for(i=0;i<DIM;i++){
for(j=0;j<DIM;j++){
printf("Digite o valor do elemento (%d,%d) da matriz: ", i+1,j+1);
scanf("%d", &matriz[i][j]);
}
}

printf("\n\n");
}

void imprime(int *matriz, int DIM){
int i,j;
printf("Impressao da matriz lida:\n\n");
for(i=0;i<DIM;i++){
for(j=0;j<DIM;j++){
printf("%3d", matriz[i][j]);
}
printf("\n");
}
printf("\n\n");

}

int main(){
int opcao,N;
int *MAT[N][N];

//Lê a ordem quadrado da matriz
N = ordem_de_N();

//Lê os valores da matriz
le_matriz(&MAT, N);

//Imprime a matriz
imprime(&MAT, N);

system("pause");
return 0;
}


  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 29/04/2015 - 22:37h

Eu corrigi seu programa de acordo com a listagem abaixo. Embuti comentários ao longo do código para indicar as correções. Intuo que você esteja usando C, em vez de C++, conforme o padrão de 1999. Se não for, avise, para que eu possa fazer outras observações.

#include <stdio.h>
#include <stdlib.h>

int ordem_de_N(){
int ret_code;
int ordem;

printf("Digite um valor de ordem para a Matriz, min = 1 e max = 10: ");
do{
// No Ubuntu, é obrigatório considerar o valor de
// retorno de scanf(). Todos os outros sistemas
// deveriam fazer o mesmo.
ret_code=scanf("%d", &ordem);
if(ret_code==EOF){
fprintf(stderr, "Fim de entrada. Abortando o programa.\n");
exit(1);
}
else if(ret_code!=1){
// Possíveis caracteres espúrios na entrada. Descarta-os.
// De novo, há de se considrar o retorno de scanf().
if(scanf("%*[^\n]%*1[^\n]")==0)
;
}
else if(ordem>=1 && ordem<=10)
// Interrompe o loop se o valor foi lido OK.
break;
printf("Valor de ordem invalido. Por favor, digite um valor entre 1 e 10: ");
} while(1); // Testa o valor de ordem só uma vez, no if acima.

return(ordem);
}

/*
Usa o recurso do C99 de arrays com dimensões variáveis.
Repare que eu troquei a ordem dos argumentos, para que
o valor ‘dim’ seja conhecido no momento da declaração de
‘matriz’, com o tamanho adequado.

NOTA: Troquei o nome ‘DIM’ para ‘dim’ porque geralmente
nomes todos em maiúsculas indicam macros do preproces-
sador ou variáveis globais constantes. Aqui, o que você tem
é apenas um parâmetro de função.
*/
void le_matriz(int dim, int matriz[dim][dim]){
int i,j;

printf("Agora preencha a Matriz com valores inteiros.\n\n");
for(i=0;i<dim;i++)
for(j=0;j<dim;j++)
do {
int ret_val;
printf("Digite o valor do elemento (%d,%d) da matriz: ", i+1,j+1);
ret_val=scanf("%d", &matriz[i][j]);
if(ret_val==EOF){
fprintf(stderr, "Fim de entrada. Abortando o programa.\n");
exit(1);
}
else if(ret_val==1)
// Leitura OK.
break;
fprintf(stderr, "Entrada inválida: deve ser um número inteiro.\n");
// Elimina caracteres espúrios.
if(scanf("%*[^\n]%*1[^\n]")==0)
;
} while(1);

printf("\n\n");
}

/*
De novo, inverti a ordem dos parâmetros e coloquei
os nomes em letras minúsculas.
*/
void imprime(int dim, int matriz[dim][dim]){
int i,j;
printf("Impressao da matriz lida:\n\n");
for(i=0;i<dim;i++){
for(j=0;j<dim;j++)
printf("%3d", matriz[i][j]);
// putchar() é mais leve do que printf(), e nós só
// queremos mesmo imprimir um caráter.
putchar('\n');
}
printf("\n\n");
}

/*
Declaro explicitamente que main() não recebe argumentos.
Em C, se você deixar a lista de argumentos vazia, a função
poderia receber uma quantidade qualquer de argumentos
de quaisquer tipos de dados (isso é diferente do C++, que
entende uma lista de argumentos vazia como não permitindo
argumento nenhum).

Lembre-se que o padrão do C indica que main() deve ser
declarada como “int main(void)”, se não quiser receber ar-
gumentos, ou como “int main(int argc, char **argv)”, se os
quiser.
*/
int main(void){
int N;

//Lê a ordem quadrado da matriz
N = ordem_de_N();

/*
Declaro a matriz só aqui, para que o valor de
‘N’ seja conhecido. Do jeito como você tinha
feito, nem mesmo podia dizer qual era o tama-
nho da matriz alocada, pois o valor de ‘N’ era
desconhecido.

Eu também corrigi o tipo da matriz, pois você tinha
declarado uma matriz de ponteiros para inteiros, em
vez de uma matriz de inteiros.

NOTA: Arrays de tamanho variável são suportados
no C99 ou C11, mas não o são no C89 nem no C++.
*/
int MAT[N][N];

//Lê os valores da matriz.
// Repare que eu inverti a ordem dos argumentos, para
// ficar compatível com a nova ordem dos parâmetros
// da função.
le_matriz(N, MAT);

//Imprime a matriz
// De novo, ordem nova de argumentos.
imprime(N, MAT);

return 0;
}






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts