Estou com alguns problemas para passar meu EP para a forma de funções. É que eu tenho que colocar no meu EP pelo menos as 4 funções q são exigidas mas eu ñ entendi a diferença entre a função p comprimir um arquivo e a que determina o par (distr, compr). P mim, se eu determinar o par é só imprimi-lo e pronto: Aquele caractere já estará comprimido. Então eu ñ vejo nenhum lugar em que seja necessário colocar a função "comprimir_um_arquivo", sendo suficiente apenas a função que determina o par (dist, compr). Alguém poderia me ajudar?
A função que comprime um arquivo faz a tarefa completa. Ela recebe os arquivos de entrada (o arquivo original) e de saída (o arquivo comprimido, que ela deve criar). A função começa preenchendo o look-ahead com com bytes lidos do arquivo de entrada, para depois entrar num laço que implementa o algoritmo LZ77. Esse laço vai escrevendo no arquivo de saída os pares gerados pelo LZ77 e, à medida que os bytes do look-ahead vão passando para o dicionário, vai lendo do arquivo de entrada mais bytes do arquivo de entrada. O laço acaba (e a função encerra sua execução) depois que o último byte do arquivo de entrada for lido e sair do look-ahead.
Note que a função comprime_arquivo (ela não precisa ter necessiamente esse nome, fique à vontade para escolher algum outro, desde que seja um nome sugestivo) precisará, a cada volta no laço que implementa o LZ77, determinar o próximo par (dist, comp) que ela escreverá no arquivo de saída. Ou seja, ela precisará chamar a função que determina o próximo par. A função comprime_arquivo também precisará fazer com que o segmento representado por esse par passe do look-ahead para o dicionário. Para isso, ela chamará a função que desloca os bytes da janela.
Acima eu disse que a função comprime_arquivo recebe os arquivos de entrada e de saída. Aqui você tem duas alternativas: (1) fazer essa função receber os nomes desses arquivos, ou (2) fazer essa funcão receber um FILE *entrada e um FILE *saida. Na alternativa (1), a função comprime_arquivo fica com a responsabilidade de abrir os arquivos, pois ela recebe os nomes dos arquivos e tem de chamar fopen para obter um FILE *entrada e um FILE *saida. Na alternativa (2), a função principal do programa cuida de abrir os arquivos antes de chamar a função comprime_arquivo, pois neste caso os parâmetros recebidos por comprime_arquivo correspondem a arquivos já abertos.
Esse tipo de escolha é muito comum quando se projeta software. É importante a gente se acostumar a planejar o que vai fazer e pensar na estrutura geral do programa (que funções ele vai ter, qual função chama qual, etc.) antes de sair escrevendo o software. Ou seja, primeiro pense nas alternativas que você tem e faça as escolhas que lhe parecerem melhores, depois escreva o programa!
Note que a função comprime_arquivo (ela não precisa ter necessiamente esse nome, fique à vontade para escolher algum outro, desde que seja um nome sugestivo) precisará, a cada volta no laço que implementa o LZ77, determinar o próximo par (dist, comp) que ela escreverá no arquivo de saída. Ou seja, ela precisará chamar a função que determina o próximo par. A função comprime_arquivo também precisará fazer com que o segmento representado por esse par passe do look-ahead para o dicionário. Para isso, ela chamará a função que desloca os bytes da janela.
Acima eu disse que a função comprime_arquivo recebe os arquivos de entrada e de saída. Aqui você tem duas alternativas: (1) fazer essa função receber os nomes desses arquivos, ou (2) fazer essa funcão receber um FILE *entrada e um FILE *saida. Na alternativa (1), a função comprime_arquivo fica com a responsabilidade de abrir os arquivos, pois ela recebe os nomes dos arquivos e tem de chamar fopen para obter um FILE *entrada e um FILE *saida. Na alternativa (2), a função principal do programa cuida de abrir os arquivos antes de chamar a função comprime_arquivo, pois neste caso os parâmetros recebidos por comprime_arquivo correspondem a arquivos já abertos.
Esse tipo de escolha é muito comum quando se projeta software. É importante a gente se acostumar a planejar o que vai fazer e pensar na estrutura geral do programa (que funções ele vai ter, qual função chama qual, etc.) antes de sair escrevendo o software. Ou seja, primeiro pense nas alternativas que você tem e faça as escolhas que lhe parecerem melhores, depois escreva o programa!
Ah.... Axo q estou entendendo. É que o raciocínio que eu estava usando estava bem diferente....
+ então, pela explicação daí de cima, quer dizer que eu posso deixar a função comprimir_um_arquivo como sendo a "principal" e então eu coloco as outras funções dentro dela? Tipow, eu abro apenas uma vez a função comprimir_um_arquivo e só fecho ela uma vez quando terminar a execução do programa (como se o meu main fosse a função comprimir_um_arquivo)?
In reply to Rafael Obara
Re: Fazendo o EP com as funções básicas exigidas
Isso mesmo.
Com o decorrer do tempo e do curso do BCC de vocês, vocês verão que o main ficará menor e praticamente tudo será feito nas funções.
O ideal nesse EP seria o main só ter uma "bifurcação" com a escolha da compressão ou descompressão e fossem feitas chamadas para a compressão e a descompressão no main. Todo o resto seria feito nas funções. Mas certifiquem-se de terminar o programa no main, nada de ficar usando exit(0).
Com o decorrer do tempo e do curso do BCC de vocês, vocês verão que o main ficará menor e praticamente tudo será feito nas funções.
O ideal nesse EP seria o main só ter uma "bifurcação" com a escolha da compressão ou descompressão e fossem feitas chamadas para a compressão e a descompressão no main. Todo o resto seria feito nas funções. Mas certifiquem-se de terminar o programa no main, nada de ficar usando exit(0).
In reply to Rodrigo Luiz Marques Flores
Re: Fazendo o EP com as funções básicas exigidas
by Rafael Obara -
Aew!!!!!! Vlews.....
In reply to Rodrigo Luiz Marques Flores
Re: Fazendo o EP com as funções básicas exigidas
Desculpe, mas eu usei o exit() em alguns lugares. Eu tenho que mudar ou vc só pede que se o programa rodar até o fim ele termine na função main (podendo então usar o exit se der algum erro em outras funções)?
In reply to José David Fernández Curado
Re: Fazendo o EP com as funções básicas exigidas
Você pode usar o exit(), mas somente em casos onde o programa falha (ex: o fopen devolveu NULL quando pediu para abrir um arquivo).
Usar o exit() num funcionamento normal do programa não é bom.
Usar o exit() num funcionamento normal do programa não é bom.
In reply to Rodrigo Luiz Marques Flores
Re: Fazendo o EP com as funções básicas exigidas
Beleza, então. Valew.
In reply to Rodrigo Luiz Marques Flores
Re: Fazendo o EP com as funções básicas exigidas
by Rafael Obara -
Ainda ñ sei muito bem como usar o end of file. Pesquisei na internet e tentei usá-lo de várias formas:
while (!eof){
while (not EOF){
while (feof(entrada) == 0){
while (!feof(entrada)){
while (janela[254] != feof){
Mas nada dá certo. Eu estou usando o eof de maneira errada?
while (!eof){
while (not EOF){
while (feof(entrada) == 0){
while (!feof(entrada)){
while (janela[254] != feof){
Mas nada dá certo. Eu estou usando o eof de maneira errada?
In reply to Rafael Obara
Re: Fazendo o EP com as funções básicas exigidas
A sintaxe while (!feof(entrada)){
deveria funcionar. Você tem certeza que está lendo alguma coisa dentro desse while (e assim incrementando a entrada?)?