Dúvida Conceitual

Dúvida Conceitual

por Caio Burin Ferreira -
Número de respostas: 10
Tô com uma dúvida:

no enunciado do programa, é pedido pra que seja feita uma função read_pgm
nessa função os parametros sao: *fname, *n, *m, m[][MAX] e *maxval.

não consigo entender o pq de n e m serem apontadores
como eu vou percorrer a matriz do arquivo de entrada, se eu nao sei quantas colunas e linhas ele tem?

outra: essa função é responsàvel SÓ pela leitura do arquivo, ou ela tbm vai fazer as mudanças na matriz, ou seja, ela vai identificar a matriz do arquivo ou vai "passar o filtro" nele? ou os dois? ou nenhum? hehehh...

OUUTRA: o que tem de ser devolvido nessa função? a matriz "filtrada"?

aiaiaia q coisa...
valew! =-p
Em resposta à Caio Burin Ferreira

Re: Dúvida Conceitual

por Francisco Reverbel -
Os parâmetros n e m são apontadores porque a função read_pgm vai ler do arquivo de entrada o número de linhas e o número de colunas da matriz e precisa devolver esses valores para quem chamou read_pgm. Antes de chegar na parte do arquivo de entrada que contém a matriz, a função read_pgm lerá o cabeçalho do arquivo, que inclui informações sobre número de colunas e de linhas.

A função read_pgm é responsável só pela leitura do arquivo PGM e pelo preenchmento da matriz. A função write_pgm é responsável só pela escrita da matriz num arquivo PGM, precedida pelo cabeçalho que inclui informações sobre número de colunas e de linhas. Crie uma terceira função para fazer a filtragem. É conveniente criar também uma função auxiliar, que calcula a mediana dos elementos numa vizinhança de uma matriz. A função que faz a filtragem faria chamadas a esta função auxiliar para ir obtendo os valores dos elementos da matriz filtrada.

Em resposta à Francisco Reverbel

Re: Dúvida Conceitual

por Gustavo Bighellini Machado Gonçalves Martins -

tbm tenho uma duvida..

as funções read_pgm e write_pgm TÊM que serem do tipo int ou podem ser do tipo void? pq para mim faz mais sentido elas serem void

Em resposta à Gustavo Bighellini Machado Gonçalves Martins

Re: Dúvida Conceitual

por Francisco Reverbel -
A idéia é que essas funções devolvam um valor que informa se a operação (a leitura ou a escrita) foi bem sucedida ou não. No caso da leitura, por exemplo, você vai querer saber se a leitura foi bem sucedida e se a função read_pgm de fato preencheu a matriz. Voce precisará saber isso antes de sair usando a matriz que deve ter sido preenchida pela função read_pgm!

Tanto a leitura como a escrita podem fracassar por vários motivos. O exemplo no enunciado mostra os problemas que podem acontecer na leitura: erro na abertura do arquivo (se o arquivo não existir, é esse o erro que vai acontecer), erro na leitura do arquivo, arquivo com formato inválido... O mais prático é fazer a função read_pgm apresentar uma mensagem de erro caso algum desses erros aconteça e devolver para quem a chamou o valor FALSE, para indicar "operação mal sucedida". Assim, quem chamar read_pgm fica livre para decidir o que fazer em caso de leitura mal sucedida: encerrar o programa (isto é o mais fácil para quem escreve o programa) ou pedir para o usuário digitar outro nome de arquivo e tentar a leitura novamente (isto é o melhor para o usuário).

Em resposta à Francisco Reverbel

Re: Dúvida Conceitual

por Caio Burin Ferreira -
Mais uma dúvida:

no enunciado, mais precisamente na seção 4, quando ele diz sobre a função read_pgm e apresenta os parâmetros da função tá escrito cada variável com seus respectivos asteríscos para os apontadores.
MAS, a variável fname hora aparece com '*' hora aparece sem. Ela é apontador tbm?

Não entendo como eu vou fazer minha função ler uma matriz de *m por *n, se estas variáveis contem o endereço de m e n, e não os valores de m e n! a mesma coisa pra fname!

Caio.
Em resposta à Caio Burin Ferreira

Re: Dúvida Conceitual

por Francisco Reverbel -
O parâmetro fname é o nome do arquivo que deve ser lido por read_pgm ou escrito por write_pgm. Ele é, na verdade, um vetor de chars. Acontece que dá na mesma declarar um parâmetro de uma função como char fname[] ou como char *fname. Por conta dessa equivalência (que a gente não explicitou em classe, embora tenhamos visto que quando um vetor é passado como parâmetro, o que realmente é passado é o endereço inicial do vetor) o enunciado saiu com o parâmetro fname declarado como ponteiro. Considere que os protótipos de read_pgm e write_pgm são

int read_pgm(char fname[], int M[][MAX], int *m, int *n, int *maxval);

int write_pgm(char fname[], int M[][MAX], int m, int n, int maxval);

Esse protótipos são rigorosamente equivalentes aos que estão no enunciado. Mesmo assim, vou atualizar o enunciado e trocar os protótipos pelos acima, para não dar mais confusão.

Quanto ao *m e ao *n, a função read_pgm recebe os endereços das variáveis onde ela deve colocar o número de linhas e o número de colunas da matriz. Ela vai descobrir qual é o número de linhas e o número de colunas lendo o cabeçalho do arquivo PGM. Quem chamar read_pgm vai passar os endereços de variáveis "número de linhas", "número de colunas" e "maxval" e vai receber de volta, nessas variáveis, os valores que a função read_pgm leu do cabeçalho do arquivo PGM.
Em resposta à Francisco Reverbel

Re: Dúvida Conceitual

por Francisco Reverbel -
Eu tinha dito:

"Esse protótipos são rigorosamente equivalentes aos que estão no enunciado. Mesmo assim, vou atualizar o enunciado e trocar os protótipos pelos acima, para não dar mais confusão."

Não consegui fazer isso antes, só agora pude atualizar o enunciado. Na versão atualizada, os protótipos das funções read_pgm e write_pgm têm char fname[] em vez de char *fname.

Em resposta à Francisco Reverbel

Re: Dúvida Conceitual

por Caio Burin Ferreira -
Última dúvida, prometo! heeheheh

a função write_pgm cria um arquivo pgm?! ou ela só preenche um arquivo pre-existente?!
pq quando eu não tenho arquivo nenhum "pré-aberto" com o nome do arquivo de saida que o usuário digitar, ela fecha o programa!
Mas quando eu crio um arquivo com o nome que o usuário colocaria antes de rodar o programa ele funciona!
O que acontece?!?