Pages: [1]   Go Down
Print
Author Topic: Dubbio soluzione esercizio 29 PICT  (Read 1349 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« on: 09-12-2014, 17:58:13 »

riporto qui la soluzione presente sul sito... in questo codice vengono definiti due client ma che hanno lo stesso comportamento, il mio dubbio riguarda appunto il fatto che dovrebbe essere necessario definire due client diversi pur utilizzando def (che ci permette di replicare il processo definito). Sto cercando di verificarlo con il compilatore online ma ogni tanto non riesco a farlo funzionare e non ho capito il perché... alla fine del post propongo una soluzione alternativa, vorrei sapere se sarebbe una soluzione corretta o in alternativa perché sarebbe sbalgiata. Grazie Smiley

new lock:^[]
new result:^Int

def increment n:Int =
    result!(+ 1 n)

def client1 (n:int) =
         
       lock?[] = ( increment!n
                 | result?m = ( USE(m)
                              | lock![]
                              | cient1!m))

def client2 (n:int) =
         
       lock?[] = ( increment!n
                 | result?m = ( USE(m)
                              | lock![]
                              | cient1!m))

run (lock![]|client1!3|client2!5)

qualcuno mi sa dire perché (... e se...) non sarebbe possibile utilizzare più semplicemente il seguente codice?


new lock:^[]
new result:^Int

def increment n:Int =
    result!(+ 1 n)

def client (n:int) =
         
       lock?[] = ( increment!n
                 | result?m = ( USE(m)
                              | lock![]
                              | client!m))

run (lock![]|client!3|client!5)


Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #1 on: 10-12-2014, 11:23:38 »

mi autocorreggo.... con il codice che ho scritto c'è un problema dovuto al fatto che entrambe le copie del client (e tutte le eventuali altre..) attendono sullo stesso canale result quindi uno potrebbe ricevere il risultato dell'altro.. modifico il codice come segue, le mie domande restano Smiley

new lock:^[]

def increment n:Int result:^Int=
    result!(+ 1 n)

def client (n:int)  result:^Int =
        
       lock?[] = ( increment![n result]
                 | result?m = ( USE(m)
                              | lock![]
                              | client![m result]))

new res1:^Int
new res2:^Int
run (lock![]|client![3 res1]|client![5 res2])

Nb. Ho applicato la correzione all errore notata successivamente dal Prof.
« Last Edit: 10-12-2014, 14:22:12 by alex180788 » Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Franco Barbanera
Moderator
Forumista Eroico
*****
Offline Offline

Posts: 2.622



WWW
« Reply #2 on: 10-12-2014, 12:06:15 »

La soluzione che proponi va benissimo quando i due clienti fanno esattamente
la stessa cosa
(in realta' c'e' un piccolo errore, poiche' alla fine occorre fare client!(m,result).
 Se invece supponi che i due clienti facciano cose diverse con il risultato
incrementato, allora devi dare due def.
In realta' la soluzione sul sito andrebbe corretta inserendo USE1 al posto di USE del cliente1
e USE2 nel cliente 2.

FB
Logged
alex180788
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 422


« Reply #3 on: 10-12-2014, 14:20:29 »

Grazie Professore, si avevo supposto che facessero la stessa cosa
Logged

Codice etico e di pratica professionale dello sviluppo software:
..
..
7. Colleghi. Gli sviluppatori software devono essere leali e di supporto nei confronti dei loro colleghi.
...
Pages: [1]   Go Up
Print
Jump to: