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
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
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).
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).
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.
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.
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.
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.
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.
"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.
ai ai to com medo desse EP
Ú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?!?
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?!?
Eu acho q a função write tem q abrir um outro arquivo de saída, como fizemos no ep 3...
Sim, a função write_pgm cria um arquivo pgm.