|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
[java] dove sbaglio ?
ciao ,
ho fatto il seguente esercizio : Codice:
/*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.*/ Codice:
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) {} } } Codice:
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); } } Non vi chiedo di farlo voi , sia chiaro ![]() ![]() 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 !!! ![]() Ultima modifica di aeroxr1 : 12-09-2010 alle 08:47. |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Mar 2006
Messaggi: 2056
|
ho modificato in observe il while per il wait() in :
Codice:
while(conta==0) {wait();} ![]() 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 Codice:
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; } Codice:
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 ? ![]() ![]() ![]() Ultima modifica di aeroxr1 : 12-09-2010 alle 08:48. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 01:39.