Dúvida Conceitual

Dúvida Conceitual

by Caio Burin Ferreira -
Number of replies: 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
In reply to Caio Burin Ferreira

Re: Dúvida Conceitual

by 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.

In reply to Francisco Reverbel

Re: Dúvida Conceitual

by 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

In reply to Gustavo Bighellini Machado Gonçalves Martins

Re: Dúvida Conceitual

by 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).

In reply to Francisco Reverbel

Re: Dúvida Conceitual

by 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.
In reply to Caio Burin Ferreira

Re: Dúvida Conceitual

by 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.
In reply to Francisco Reverbel

Re: Dúvida Conceitual

by 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.

In reply to Francisco Reverbel

Re: Dúvida Conceitual

by 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?!?
In reply to Caio Burin Ferreira

Re: Dúvida Conceitual

by Daniel Shkromada -

Eu acho q a função write tem q abrir um outro arquivo de saída, como fizemos no ep 3...