Scorrimento matrice ricorsione C

Messaggioda abaco90 » 14/04/2018, 17:10

Ciao a tutti,

sto cercando di scrivere una funzione che scorre una matrice e ritorna 1 quando trova il numero 8.

Questo è il mio codice:

#define DIM 4

Codice:
int scorrimatrice(int matrice[DIM][DIM], int r, int c, int dimensione) {

   if (matrice[r][c] == 8) {

      return 1;
   }

   else if (c == dimensione) {

      return scorrimatrice(matrice, r++, 0, dimensione);
   }

   else return scorrimatrice(matrice, r, c++, dimensione);
}

int main () {

   int matrice[DIM][DIM] = {

      {1, 0, 0, 2},
      {0, 0, 7, 0},
      {0, 1, 9, 0},
      {2, 0, 1, 8}
   };

   printf("%d\n", scorrimatrice(matrice, 0, 0, 4));

   return 0;
}


ma continua a darmi segmentation fault. Credo di essere vicino alla soluzione, ma non capisco dove sbaglio.

Qual è l'errore?

Grazie!
abaco90
Junior Member
Junior Member
 
Messaggio: 181 di 400
Iscritto il: 01/11/2016, 17:38

Re: Scorrimento matrice ricorsione C

Messaggioda vict85 » 14/04/2018, 20:08

Devi fare il test con dimensione-1 e non con dimensione. Inoltre non stai gestendo il caso in cui non trovi alcun 8 nella matrice.
vict85
Moderatore
Moderatore
 
Messaggio: 9299 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: Scorrimento matrice ricorsione C

Messaggioda Super Squirrel » 14/04/2018, 20:24

In realtà ci sono varie cose che non vanno:
- c++ ritorna il valore di c prima dell'incremento, quindi la ricorsione avviene continuamente con valori di r e c pari a 0. Al posto di c++ avresti dovuto usare ++c o ancora meglio un semplice c+1 (lo stesso discorso vale anche per r);
- ipotizziamo di entrare nella funzione con r=0 e c=3 (in pratica stiamo analizzando la prima riga). Stando al codice verrà invocata nuovamente la funzione con r=0 e c=4, ma l'elemento matrice[0][4] non fa parte della matrice. La condizione andrebbe quindi corretta in c==dimensione-1;
- ipotizziamo che non ci siano 8 e di entrare nella funzione con r=3 e c=3. Stando al codice verrà invocata nuovamente la funzione con r=4 e c=0, ma siamo chiaramente al di fuori della matrice. Non essendoci inoltre alcun controllo su r, tale variabile sarà incrementata continuamente;
- ipotizzando che non ci siano 8, che valore ti aspetti che ritorni la funzione? Bisogna quindi aggiungere un return 0 (o qualsiasi altro valore) alla fine della funzione.

Io farei qualcosa del genere:

Codice:
#include<stdio.h>
#include<stdlib.h>

#define DIM 4

int scorrimatrice(int matrice[DIM][DIM], int r, int c)
{
    if(matrice[r][c] == 8)
    {
        return 1;
    }
    else if(c != DIM - 1)
    {
        return scorrimatrice(matrice, r, c + 1);
    }
    else if(r != DIM - 1)
    {
        return scorrimatrice(matrice, r + 1, 0);
    }
    return 0;
}

int main()
{
    int matrice[DIM][DIM] = {{1, 0, 0, 2},
                             {0, 6, 7, 0},
                             {6, 1, 9, 0},
                             {2, 0, 1, 8}};
    printf("%d", scorrimatrice(matrice, 0, 0));
    return 0;
}
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 187 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Scorrimento matrice ricorsione C

Messaggioda abaco90 » 15/04/2018, 14:53

Vi ringrazio entrambi per le risposte!

Ho provato a sostituire r++ con r + 1 e c++ con c + 1, lasciando invariato il resto del codice e funziona.
In realtà non ho scritto il caso in cui non trovo nessun 8 in quanto era solo un test per provare la ricorsione sulle matrici.

Non ho ancora capito però come mai scrivendo + 1 invece che ++ funziona. Non hanno lo stesso significato?
abaco90
Junior Member
Junior Member
 
Messaggio: 182 di 400
Iscritto il: 01/11/2016, 17:38

Re: Scorrimento matrice ricorsione C

Messaggioda Super Squirrel » 15/04/2018, 17:56

OK che è una prova e non hai gestito il caso di 8 assente, ma come evidenziato al punto 2 del mio precedente post, stai analizzando zone di memoria che non competono alla matrice, quindi oltre al ++ qualche aggiustamento andrebbe apportato.

Per quanto riguarda l'operatore di incremento ++, esso può essere sia prefisso che postfisso e ovviamente agiscono in modo diverso:
- quello prefisso (++n), incrementa n e ritorna il valore incrementato;
- quello postfisso (n++), incrementa n, ma ritorna il valore non incrementato.
Per rendertene conto, una volta dichiarata e inizializzata una variabile intera n, prova a stampare in sequenza ++n e n e poi n++ e n.
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 188 di 1486
Iscritto il: 16/05/2013, 22:05

Re: Scorrimento matrice ricorsione C

Messaggioda abaco90 » 18/04/2018, 08:20

Ho capito, sei stato molto chiaro, grazie mille! :) :)
abaco90
Junior Member
Junior Member
 
Messaggio: 183 di 400
Iscritto il: 01/11/2016, 17:38


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite