Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA
In tre giorni a Las Vegas Oracle ha presentato agenti che eseguono il lavoro, l'alleanza con OpenAI e un cloud aperto agli acceleratori di tutti. Ma i clienti europei chiedono garanzie prima ancora delle funzionalità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 11-09-2010, 19:18   #1
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2057
[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.*/
e l'ho svolto così :

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) {}
    }
         
}
e questo è il main che invece mi ha dato il professore :

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);
    }
}
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 !!!

Ultima modifica di aeroxr1 : 12-09-2010 alle 09:47.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
Old 12-09-2010, 09:26   #2
aeroxr1
Senior Member
 
Iscritto dal: Mar 2006
Messaggi: 2057
ho modificato in observe il while per il wait() in :

Codice:
        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
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;
    }
dopo di chè ho modificato il metodo observe in questa maniera :

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 ? Non l'ho capito

Ultima modifica di aeroxr1 : 12-09-2010 alle 09:48.
aeroxr1 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Recensione Samsung Galaxy Tab S12 Ultra: non chiamatelo tablet... è molto di più Recensione Samsung Galaxy Tab S12 Ultra: non chi...
Google lancia il backup automatico delle...
AMD, spunta una Radeon RX 470 con quattr...
Furto da 6,3 miliardi di dollari a Binan...
Grok, limiti esauriti di colpo nel fine ...
REDMAGIC 12 Pro: con ventola e raffredda...
Windows 11 26H2 ora disponibile per tutt...
Gli Xiaomi 18 Pro sono pronti per l'Euro...
Phantom Blade Zero da record: nelle prim...
Il paradosso di Android 17: è l'u...
Linux cresce ancora tra gli utenti Steam...
Non solo iPhone e Mac: Apple dovrebbe la...
Milioni di box Android TV trasformate in...
La Germania pungola l'Europa e punta a q...
Recensione UGREEN HomeAgent: è ar...
Il meglio di Amazon oggi in 12 articoli ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:07.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v