[Risolto] Aiuto: update_wator

Siccome sto impazzendo (basta vedere l'ora xD), pensavo di aver chiuso col frammento 1 (infatti ho già iniziato col 2), ma mi sono accorto che la mia implementazione di update_wator non andava bene. Mi son messo a rifarla, ma continua a darmi errore di segmentazione. Penso (non ne sono sicuro, ma dato che tutti i test funzionano tranne l'ultimo) che ci sia un errore nella funzione che ho fatto (non so se semantico/sintattico/concettuale) e non nelle altre. In definitiva la posto qua, se per caso qualcuno notasse ad occhio un errore stupido o sapesse dirmi dove sto sbagliando gliene sarei grato (così da poter continuare con il secondo frammento >_<).

int update_wator(wator_t* pw){
// Controllo argomento passato
CHECK_ARG(pw, "Argomento non valido - update wator", (-1));
int k, l = 0;

for(int i=0; i < pw -> plan -> nrow; ++i){
for(int j=0; j < pw -> plan -> ncol; ++j){
k = i;
l = j;

// PESCI
if (pw->plan->w[j] == FISH){

// PESCE SI RIPRODUCE
if(fish_rule4 (pw, i, j, &k, &l ) == -1){
return -1;
}

// SI E' RIPRODOTTO
if(k != i || l != j){
pw -> plan -> w[k][l] = FISH;
k = i;
l = j;
}

// PESCE SI MUOVE
if(fish_rule3 (pw, i, j, &k, &l ) == -1){
return -1;
}

// SI E' MOSSO
if(k != i || l != j){
pw -> plan -> w[j] = WATER;
pw -> plan -> w[k][l] = FISH;
}
} else {

// SQUALI
if (pw->plan->w[j] == SHARK){

// SQUALO SI RIPRODUCE E MUORE
int a = shark_rule2 (pw, i, j, &k, &l );
if(a == -1){
return -1;
} else {

// SI E' RIPRODOTTO
if(i != k || j != l){
pw -> plan -> w[k][l] = SHARK;
k = i;
l = j;
}

// E' MORTO
if(a == DEAD){
pw -> plan -> w[j] = WATER;
}
}

// SQUALO MANGIA E SI MUOVE
a = shark_rule1 (pw, i, j, &k, &l );
if(a == -1){
return -1;
}

// HA MANGIATO O SI E' MOSSO
if(i != k || j != l){
pw -> plan -> w[j] = WATER;
pw -> plan -> w[k][l] = SHARK;
}
}
}
}
}


// Aggiorno tempo (chronon) e contatori
pw -> chronon++;
pw -> nf = fish_count(pw -> plan);
pw -> ns = shark_count(pw -> plan);
return 0;
}

Comments

  • BaggioBaggio Posts: 7
    A primo sguardo sembrerebbe che ti sei dimenticato un indice quando vai ad analizzare la matrice w. Mi spiego meglio: quando vai a fare il controllo devi mettere sempre entrambi gli indici (uno per la riga e uno per la colonna). Ad esempio nel primo controllo dovrai mettere if (pw->plan->w[j] == FISH) perchè stiamo guardando il contenuto di una cella della matrice, non di un array.
  • BaggioBaggio Posts: 7
    ok scusa mi ha rubato anche a me un indice questa fottuta tastiera quindi l'errore sta da un'altra parte :)
  • BaggioBaggio Posts: 7
    Comunque riguardando il codice credo che tu non abbia analizzato quando nella cella della matrice hai acqua. In tal caso con questo codice cercherebbe di applicare le regole dello squalo alle celle che sono vuote. Devi mettere un if in più dove gestisci quel caso(incrementerai soltanto j)
  • edited June 2015
    Sì, gli indici i li ha rubati per mettere in corsivo.
    Per quanto riguarda il caso acqua.. se io faccio:
    if(FISH) { } else { if(SHARK) { } } non credo che serva: quando c'è acqua non dovrebbe far niente. Comunque dopo provo a ridare un'occhiata tenendone conto :)
  • edited June 2015
    Dovrei aver risolto:
    in update_wator c'era un errore, nel senso che, se con shark_rule2 lo squalo moriva, poi non avrebbe dovuto fare shark_rule1; ma quello che mi creava l'errore era un altro in una rule, solo che funzionandomi il test12 non riuscivo a trovarlo.

    Ora, la mia domanda è: va bene (concettualmente) che, più va avanti la simulazione, meno pesci ci sono? Perché, facendo così, a seconda di dove nasce uno squalo può anche riprodursi subito nello stesso chronon e pure mangiare, quindi ci sarà una crescita elevata di squali e la scomparsa dei pesci.

    In più dopo è insensato che gli squali continuino a riprodursi e vivere senza fonti di cibo D:
  • paoloqazpaoloqaz Posts: 10
    Da shark2015.pdf:
    I pesci e gli squali appena nati vengono aggiornati solo al chronon successivo.
  • paoloqaz wrote: »
    Da shark2015.pdf:
    I pesci e gli squali appena nati vengono aggiornati solo al chronon successivo.

    Sì sì, ho visto, ma nel frammento 1 l'aggiornamento (e pure qualche funzione) erano semplificati rispetto quello che è il progetto completo.
    Aggiornerò water.c alle specifiche completare, in quel modo sarà più "realistico".
Sign In or Register to comment.