Questão 2 da Prova 1

Questão 2 da Prova 1

por José Coelho de Pina -
Número de respostas: 2

Salve,

Estou anexando a este tópico o enunciado da questão 2 e um programa (afunda.c) que contém uma versão da função afundaIlha pedida na questão.
Além disso, também estou anexando um arquivo com uma imagem, o ilha.txt.

Aqui vão alguns exercícios para vocês:

  1. No programa afunda.c fornecido  troquem as linhas
      nPixels += afundaIlha(...,...,img);
    
    por
      return nPixels + afundaIlha(...,...,img);
    
    Depois testem e vejam o que acontece.
  2. No programa afunda.c fornecido  troquem as linhas
      int afundaIlha(int x, int y, int **img)
    
    por
      int afundaIlha(int x, int y, int img[20][30])
    
    Depois testem e vejam o que acontece.
  3. No programa afunda.c fornecido troquem as linhas
      int afundaIlha(int x, int y, int **img)
    
    por
      int afundaIlha(int x, int y, int img[][])
    
    Depois testem e vejam o que acontece.
  4. No programa afunda.c fornecido mudem no main a declaração da matriz img de dinâmica para estática, ou seja, removam a parte da alocação dinâmica da matriz img e troquem a declaração de
      int **img;
    
    por
      int img[20][30];
    
    Depois testem e vejam o que acontence.
  5. Em geral, alterem brinquem com o programa afunda.c fornecido como desejarem, testem e vejam o que acontece.
Em resposta à José Coelho de Pina

Re: Questão 2 da Prova 1

por Ricardo Mikio Morita -

1. O programa vai retornar o valor da casa. Como é no main, ele sairá do programa após isso. 

Pergunta: e se eu quisesse visualizar o valor retornado? Ele não deveria dar um aviso que o programa terminou com o status X?

 

2. Mudando tanto o protótipo como o nome da função, o programa dá um warning quando compilamos. Quando pedimos pra afundar a ilha, a função afundaIlha não irá afetar a img que foi declarada na main pq estará manipulando um vetor que será desalocado quando a função acabar em vez de mexer na img do main.

 

3. hmmm, não funcionou... deu diversas mensagens de erro mas acho que é pq o vetor que foi criado estava vazio então as chamadas recursivas de afundaIlha não faziam sentido = davam erro pq como se pode rastrear ao redor as casas ao redor de um vetor que seria vazio?

 

4. Ao mudar todas as declarações ao ponteiro **img por img[20][30] e retirar o trecho sobre alocação de memória, realmente funcionou. Uma coisa que não entendo é pq o vetor vazio é criado com zeros, ele não devia ter lixo lá dentro (possivelmente)? Bom, se passar uma figura maior do que 20 linhas x 30 colunas esse programa deve bugar desse jeito (segmentation fault).

Em resposta à Ricardo Mikio Morita

Re: Questão 2 da Prova 1

por José Coelho de Pina -

Oi Ricardo,

Há várias coisas envolvidas aqui. E todos elas tem a ver com o conceito de endereço e com o fato que

quando dado img não sabemos onde está o elemento, digamos, img[3][4] da matriz na memória, então o compilador não saberá gerar o código para isto.

Entre as coisa envolvidas aqui temos que

  • Em protótipos "int *v" é o mesmo "int v[]";
  • Em protótipos "int *img[]" é equivalente a "int **img" (em particular "char *argv[]" é o mesmo que "char **argv");
  • "int img[][]" não faz sentido, não é equivalente a int **img;
  • Se declararmos no protótipo "int **img" devemos chamar a função apenas com matrizes alocadas dinamicamente ("malloc dos apontadores (int*) para as linhas e depois malloc de cada linha);
  • A declaração "int img[][30]" no protótipo (Sim, a primeira dimensão é supérflua. Por que?) diz que a matriz imgtem todos os seus elementos consecutivos na memória (depois do img[0][29] vem img[1][0],. . .). Com está declaração só podemos chamar a função com matrizes alocadas estaticamente.

Para ver que as declarações "int **img" e "int img[][30]" não são equivalente vejam as ilustrações da aula 06 e o programa /programas/ponteiros/ponteiros-exemplo2.c disponibilizado junto com as notas de aula.

Declaração estática de matriz: int img[20][30];
Declaração dinâmica de matriz: int **img; junto com os malloc.