PDA

View Full Version : [java] dove sbaglio ?


aeroxr1
11-09-2010, 19:18
ciao ,
ho fatto il seguente esercizio :
/*Esercizio 2 (Esami di Calcolatori Elettronici e Programmazione)
Definire in Java quanto richiesto (scrivere nel file Esa.java, compilare ed eseguire utilizzando i comandi indicati
nelle procedure d'esame).
Definire: 1) una classe Msg con campi pubblici String msg e int prio; 2) una classe Log con metodi pubblici void
log(int prio, String msg) e Msg[] observe(int min, int max). La classe colleziona messaggi di priorità compresa
tra 0 (minima) e 5 (massima), passati tramite il metodo log(), e permette di estrarli tramite il metodo observe(). Il
metodo observe() attende che vi sia almeno un messaggio con priorità compresa tra min (incluso) e max
(escluso), quindi restituisce tutti i messagi in questo intervallo, estraendoli dal Log. Il file contiene anche le
classi: 3) LogWriter, che estende Thread, con costruttore LogWriter(int id, int prio, Log l); 4) LogReader, che
estende Thread, con costruttore LogReader(int min, int max, Log l).
I thread di classe LogWriter devono inviare tre messaggi sul Log l, con contenuto "Thread id mess i" (i=0,1,2) e
priorita' rispettivamete prio, prio+1 e prio+2. I thread di classe LogReader devono attendere che il Log l
contenga almeno un messaggio di priorità compresa tra min (incluso) e max (escluso), quindi stampare una riga
della forma "Prio prio: msg" per ogni messaggio estratto dal Log. I thread sono avviati dal loro costruttore.*/

e l'ho svolto così :

import java.io.*;

class lista
{
private class elemento
{
Msg inf;
elemento pun;
}
elemento testa;

void insTesta ( Msg s)
{
elemento rr= new elemento();
rr.inf=s; rr.pun=testa;
testa=rr;
}

Msg estTesta()
{
Msg s= null;
if (testa!=null)
{
s=testa.inf;
testa=testa.pun;
}
return s;
}

int scorri()
{
int cont=0;
if (testa==null) return 0;
elemento rr=testa;
for(;rr!=null;rr=rr.pun)
++cont;
return cont;
}

boolean empty()
{ if (testa == null) return true;
return false;
}


}

class Msg
{
public String msg;
public int prio;
}

class Log
{
private int conta = 0;

private lista[] vett = new lista[6];

public Log() // creo le teste delle varie liste
{
for(int i=0;i<6;i++)
{
vett[i]=new lista();
}
}

public boolean verifica(int min,int max) // verifica se la lista è vuota o no ;)
{
for(int i=min;i<max;i++)
{
if(vett[i].empty())
return false;
}

return true;
}


public void contaelem(int min,int max) // conta il numero di elementi da estrarre
{
for (int i=min;i<max;i++)
{
conta+=vett[i].scorri();
}
}


public synchronized void log(int prio,String msg)
{
Msg mess=new Msg();
mess.msg=msg;
mess.prio=prio;
vett[prio].insTesta(mess);
notifyAll();
}

public synchronized Msg[] observe(int min,int max) throws InterruptedException
{
int k=0;
contaelem(min,max);
while(verifica(min,max)==false)
{wait();}
Msg[] box = new Msg[conta];
for (int i=min;i<max;i++)
{
while(vett[i].empty() != true)
{
box[k]=vett[i].estTesta();
k++;
}
}
return box;
}

}




class LogWriter extends Thread
{
private int id;
private int prio;
private Log l;

LogWriter(int id, int prio, Log l)
{
this.id=id;
this.prio=prio;
this.l=l;
start();
}

public void run()
{
Msg m=new Msg();

for(int i=0;i<3;i++)
{
l.log(prio, "Thread " + id + " mess " + i);
prio++;
}

}

}


class LogReader extends Thread
{
int min;
int max;
Log l;

LogReader(int min, int max, Log l)
{
this.min=min;
this.max=max;
this.l=l;
start();
}

public void run()
{
try
{
Msg[] msg = l.observe(min, max);
for (Msg m: msg)
Console.scriviStringa("prio " + m.prio + ": " + m.msg);
} catch (InterruptedException e) {}
}

}

e questo è il main che invece mi ha dato il professore :

import java.io.*;
class Pesa {
public static void main(String[] args) {
Log l = new Log();
LogWriter w1 = new LogWriter(0, 0, l);
LogWriter w2 = new LogWriter(3, 3, l);
LogReader r1 = new LogReader(0, 2, l);
LogReader r2 = new LogReader(4, 6, l);
LogReader r3 = new LogReader(2, 4, l);
}
}


mi stampa tutti i valori correttamente , ma mi da due eccezioni nel risultato...

Non vi chiedo di farlo voi , sia chiaro :) vi chiedo solamente se mi aiutate a trovare l'errore e in che cosa consiste :) ciò perso una giornata per trovarlo ma niente ... uff...

Il prof nella sua soluzione lo ha fatto senza creare una classe apposita per la lista e includendo la class elemento dentro la classe Log.

Riflettendoci mi sa che è una soluzione migliore , solo che oramai mi sono impuntato a trovare l'errore nella mia soluzione :)
Mi potete dare una manina ? :)

EDIT : nel post successivo ho trovato l'errore , però non so bene il perchè si sia risolto facendo le modifiche sotto riportate . POtreste aiutarmi a trovare il perchè ? Ci sono arrivato a tentativi e non sapere il, perchè di un errore mi da fastidio .

Vi ringrazio in anticipo !!! :)

aeroxr1
12-09-2010, 09:26
ho modificato in observe il while per il wait() in :

while(conta==0)
{wait();}

per rispettare quanto richiesto dal testo . Il risultato non cambia, ci son sempre le due solite eccezioni in uscita :(

Lo sto rifacendo con il metodo elemento dentro la classe Log , così sembra tutto più facile , ma mi preoccupa non riuscire a trovare l'errore nella mia versione....
che cosa avrò sbagliato ? :(

EDIT : ho trovato l'errore , in pratica prima facevo si che contaelem() andasse a modifica la variabile conta che era globale della classe , e dopo da observe utilizzavo quella variabile globale conta per fare i miei controlli. Ho modificato il tutto facendo si che conta restituisse direttamente il valore int
public int contaelem(int min,int max) // conta il numero di elementi da estrarre
{
int conta=0;
for (int i=min;i<max;i++)
{
conta=conta+vett[i].scorri();
}
return conta;
}


dopo di chè ho modificato il metodo observe in questa maniera :

public synchronized Msg[] observe(int min,int max) throws InterruptedException
{
int k=0;
int p=contaelem(min,max);
while(p==0)
{wait();}

Msg[] box = new Msg[p];
for (int i=min;i<max;i++)
{
while(vett[i].empty() != true)
{
box[k]=vett[i].estTesta();
k++;
}
}
return box;
}


il punto è : perchè la variabile globale non gli andava bene e cosi va tutto perfettamente ? :) Non l'ho capito :muro: :stordita: