Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090
Ho affidato ai due modelli lo stesso mestiere ma non lo stesso identico prompt: trasformare una storia illustrata in un video usando una RTX 3090 e modelli locali. Ne sono usciti due film, due applicazioni e due idee opposte di efficienza. Fucina, progettata con Fable 5, colpisce di più nei primi secondi. Storyboard Studio, costruito con ChatGPT/Codex, regge meglio sulla distanza e vince il confronto complessivo, ma di stretta misura
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile
Lenovo ha lanciato il ThinkTab X11 rimettendo piede nel segmento dei tablet Android con il marchio Think dopo oltre un decennio di assenza. Il risultato è un dispositivo che prende una direzione precisa: massima dotazione funzionale, costruzione resistente, autonomia fuori dagli schemi
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot
AMD Advancing AI è l'appuntamento annuale con il quale l'azienda americana mostra quelle che sono le proprie novità dal versante datacenter. Tra piattaforma Helios, GPU Instinct MI455X e processori EPYC di sesta generazione tutto quello che serve per processare l'IA sempre più complessa ed esigente
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 13-06-2011, 21:38   #1
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
[JAVA] Chiarimento su strutture lineari

Ciao a tutti,
questo è un metodo di una struttura lineare
Codice PHP:
public void rimuoviUtente(String n) {
        
Utente p inizio;
        if (
== null)
            return;
        if (
p.nome.equals(n)) {
            
inizio inizio.prox;
            return;
        }
        while ((
p.prox != null) && (!p.prox.nome.equals(n)))
            
p.prox;
        if (
p.prox != null
            
p.prox p.prox.prox;
        
//QUI!


    

Codice PHP:
public class Utente {
    
String nome;
    
String email;
    
Utente prox;
  
    public 
Utente(String nString e) {
        
nome n;
        
email e;
        
prox null;
    }

Il metodo rimuove correttamente un utente dalla lista. Quello che non capisco è: La nuova lista "p", creata all'interno del metodo, è accessibile solo all'interno del metodo. Perchè non viene copiata dentro this.inizio che è pubblico?

O meglio, siccome il metodo rimuoviUtente viene chiamato dall'esterno e dall'esterno viene letto solamente this.inizio perchè "p" non viene copiato in this.inizio?

La classe e il collaudo funziona correttamente. Ma non capisco come diavolo faccia se non gli aggiungo
Codice PHP:
this.inizio p
Se lo aggiungo dopo viene cancellato il primo nodo della lista e anche l'ultimo. E non capisco il perchè...
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 12:42   #2
Gin&&Tonic
Member
 
L'Avatar di Gin&&Tonic
 
Iscritto dal: Aug 2010
Messaggi: 138
A

Ultima modifica di Gin&&Tonic : 14-06-2011 alle 12:44.
Gin&&Tonic è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 12:43   #3
Gin&&Tonic
Member
 
L'Avatar di Gin&&Tonic
 
Iscritto dal: Aug 2010
Messaggi: 138
Codice:
while ((p.prox != null) && (!p.prox.nome.equals(n))) 
            p = p.prox; 
        if (p.prox != null) 
            p.prox = p.prox.prox; 
        //QUI! ??
devi togliere completamente l'if interno al while , non serve a nulla. La tua "lista utenti" viene già esaminata nodo per nodo dall'istruzione:

while (p.prox != null) 
     p = p.prox; 

    }



In altre parole il metodo è questo:

Codice:
public void rimuoviUtente(String n) { 
        Utente p = inizio; 
        if (p == null) 
            return; 
      
        while (p.prox != null) {
            p = p.prox; 
            if (p.nome.equals(n)) { 
            inizio = inizio.prox; 
            return; 
      }
   } 
}


Non ho capito bene cosa fà questo : Utente p = inizio;

Ultima modifica di Gin&&Tonic : 14-06-2011 alle 12:45.
Gin&&Tonic è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 21:07   #4
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Si, ma non capisco perchè non viene aggiornata la variabile this.inizio, ma solo la variabile locale

Questo ad esempio è un altro pezzo di codice.
Io ragiono così:
- Inizializzo "p" al valore this.inizio. (Prodott inizio è il primo nodo della lista)
perchè non posso scorrere direttamente su this.inizio altrimenti viene cambiato il valore e rimangono con solamente l'ultimo nodo in mano.
- Se è nullo, ovvero se sto al primo nodo, allora aggiungo un nuovo nodo al primo (this.inizio)
(Fin qui ha senso..)
- Poi ciclo i successivi nodi della lista "p"
- Quando si verifica una certa condizione, aggiorno l'attributo "quantità" di "p".

Questo codice funziona (e' un esercizio d'esempio).
Quello che non capisco è come faccia a funzionare se la variabile "p" è una variabile locale!!
Avrebbe più senso se la modifica della quantità fosse stata fatta a this.inizio (come per il primo nodo).

Illuminatemi. Non riesco a venirne a capo! Please

Codice PHP:
public void aggiornaMagazzino(String cString dint q) {
        
Prodotto p this.inizio;
        if (
== null)
            
this.inizio = new Prodotto(cdq);
        else {
            while (
p.prox != null)
                
p.prox;
            if (
condizione
                
p.quant += q;
            
        }
    } 
x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 21:19   #5
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
non è che potresti postare i codici completi di tutte le classi? così non si riesce a ragionare
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 14-06-2011, 21:22   #6
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Si, certo. Ecco qui...


Codice PHP:
public class Magazzino
{
    
Prodotto inizio;

    public 
void aggiornaMagazzino(String cString dint q) {
        
Prodotto p inizio;
        if (
== null)
            
inizio = new Prodotto(cdq);
        else {
            while (
p.prox != null)
                
p.prox;
            if (
condizione
                
p.quant += q;
        }
    }


Codice PHP:
public class Prodotto {
    
String codice;
    
String desc;
    
int quant;
    
Prodotto prox;
   
    public 
Prodotto(String cString dint q) {
        
codice c;
        
desc d;
        
quant q;
        
prox null;
    }

x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 07:56   #7
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
allora il punto è che fai casino con i campi della classe prodotto.
nel paradigma ad oggetti è sempre sconsigliabile lasciare accessibili dall'esterno campi di una classe, e quindi è anche sconsigliabile andarvi ad accedere.

il mio consiglio è di rendere disponibili dei metodi nella classe prodotto che ne accedano ai campi.

ad esempio quando vuoi settare il prossimo prodotto, invece di fare p=p.prox avrai un metodo
Codice:
public boolean setProx(Prodotto p){
     if(this.prox!=null){
          this.prox=p;
          return true;
     }
     else
          return false;
}
e poi richiami in "magazino" inizio.setProx(p);


ma perchè non usare una List?
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 20:11   #8
x3d0
Member
 
Iscritto dal: Jun 2008
Messaggi: 159
Non posso usare List perchè è un esercizio d'esame. La difficoltà è farlo senza List e framework vari.

A parte il fatto di incapsulare this.inizio. Quello è chiaro ma non è un problema ora.

Provo a spiegarmi meglio. Questo codice funziona perfettamente.
Il problema è che non capisco come faccia a funzionare.
se "p" non è nullo viene modificato un valore di un nodo della lista.
Fin qui tutto ok.
Il fatto è che la variabile "p" è locale, quindi dovrebbe morire alla fine del metodo e, subito dopo la modifica della lista, non c'è alcun legame con this.inizio!
Quando vado a stampare l'intera lista (da un altro metodo), ovvero "inizio" non vado a leggere "p"! Ma la lista risulta modificata! Cosa fà??

Codice PHP:
public class Magazzino 

    
Prodotto inizio

    public 
void aggiornaMagazzino(String cString dint q)
 { 
        
Prodotto p inizio
        if (
== null
            
inizio = new Prodotto(cdq); 
        else { 
            while (
p.prox != null
                
p.prox
            if (
condizione
                
p.quant += q
        } 
    } 

x3d0 è offline   Rispondi citando il messaggio o parte di esso
Old 15-06-2011, 20:21   #9
X3n0
Senior Member
 
Iscritto dal: Dec 2010
Città: Milano
Messaggi: 1422
tu modifichi però inizio e il campo quantità della classe prodotto, è ovvio che la tua struttura dati ne sarà modificata!

o forse non ho capito bene cosa vuoi dire...
X3n0 è offline   Rispondi citando il messaggio o parte di esso
Old 16-06-2011, 08:33   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da x3d0 Guarda i messaggi
...
Il fatto è che la variabile "p" è locale, quindi dovrebbe morire alla fine del metodo e, subito dopo la modifica della lista, non c'è alcun legame con this.inizio!
...
Quando vado a stampare l'intera lista (da un altro metodo), ovvero "inizio" non vado a leggere "p"! Ma la lista risulta modificata! Cosa fà??
...
Ciao x3d0,
credo che tu non abbia ben chiara la distinzione, in Java, tra un'istanza e il riferimento ad un'istanza.

Questa è la dichiarazione di un riferimento ad una istanza di tipo Prodotto con inizializzazione al valore di default:
Codice:
Prodotto p;
// equivale a: 
// Prodotto p = null;
Anche questa è la dichiarazione di un riferimento ad una istanza di tipo Prodotto (con inizializzazione al valore di default):
Codice:
Prodotto inizio;
// equivale a:
// Prodotto inizio = null;
"p" e "inizio", nei codici qui sopra, sono dei riferimenti inizializzati a null, cioè non si riferiscono (oppure non puntano, non sono collegati, come preferisci) a nessuna istanza di Prodotto.
Se provi ad accedere ad un membro di istanza di Prodotto (ad esempio al membro "codice" così: "p.codice;") tramite uno di questi due riferimenti viene lanciata una NullPointerException.

Come abbiamo detto, "p" e "inizio" sono dei riferimenti. Ma quando entrano in gioco le istanze vere e proprie?
Quando vengono create con la keyword "new".
Qui, ad esempio:
Codice:
Prodotto p = new Prodotto(c, d, q);
Cosa succede? A sinistra dell'operatore di assegnamento viene dichiarato "p" come un riferimento di tipo Prodotto; a destra dell'operatore di assegnamento viene creata un'istanza di Prodotto.
Il risultato ora è che "p" si riferisce a quell'istanza di Prodotto.
Nota come nel codice un'istanza di per se non ha un nome, è anonima; a venire nominati sono solo i riferimenti alle istanze (in Java).

Un ultimo esempio.
Nel codice che segue immagina che la chiamata a stampa() abbia l'effetto di stampare il nome di ogni riferimento a Prodotto esistente seguito dal valore dei membri dell'istanza di Prodotto a cui è collegato.
Codice:
Prodotto inizio, p;

// 1)
inizio = new Prodotto("123", "istanza1", 1);
p = inizio;
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["123", "istanza1", 1]

// 2
inizio = null;
stampa();
// inizio = null
// p = ["123", "istanza1", 1]

// 3
inizio =  new Prodotto("456", "istanza2", 1);
stampa();
// inizio = ["456", "istanza2", 1]
// p = ["123", "istanza1", 1]

// 4
Prodotto tmp = inizio:
inizio = p;
p = tmp;
tmp = null;
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["456", "istanza2", 1]
// tmp = null

// 5
Prodotto a, b;
a = new Prodotto("789, "istanza3", 1);
b = a;
a.codice = "999";
b.desc = "istanzaX";
stampa();
// inizio = ["123", "istanza1", 1]
// p = ["456", "istanza2", 1]
// tmp = null
// a = ["999", "istanzaX", 1]
// b = ["999", "istanzaX", 1]
La morale è che l'operatore di assegnamento (=) applicato ad un riferimento collega quel riferimento con un'istanza, o indicando l'istanza a cui collegarsi direttamente (il caso del new) o indicandola indirettamente tramite un'altro riferimento.
Cioè l'assegnamento è un'operazione che modifica il riferimento (lo fa puntare ad un'altra istanza) e non tocca le istanze.

Invece l'assegnamento applicato a un membro di istanza attraverso un riferimento a quella istanza (il caso di a.codice = ... oppure b.desc = ..., con a e b che puntano alla stessa istanza) è una mutazione che si applica all'istanza stessa e non tocca i riferimenti (cioè non sono "a" e "b" a venire modificati, ma l'istanza a cui entrambi si riferiscono).


Ora prova ad analizzare nuovamente la classe Magazzino e il suo metodo aggiornaMagazzino: dovresti essere in grado di spiegarci cosa fa, e quindi perchè "funziona"
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)

Ultima modifica di banryu79 : 16-06-2011 alle 13:47.
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Fable e Sol a confronto: due cartoni animati creati su un PC con RTX 3090 Fable e Sol a confronto: due cartoni animati cre...
Il tablet rugged leggero e sottile: Lenovo ThinkTab X11 offre resistenza, doppia USB-C e batteria rimovibile Il tablet rugged leggero e sottile: Lenovo Think...
AMD Advancing AI 2026: l'hardware AMD per le elaborazioni IA del futuro, tra GPU, CPU e robot AMD Advancing AI 2026: l'hardware AMD per le ela...
Tascabile e con Android: BOOX Go 6 Gen II è diverso da tutti gli altri e-reader Tascabile e con Android: BOOX Go 6 Gen II &egrav...
Recensione Lenovo Idea Tab Plus: il tablet da 12 pollici che costa meno di 300 euro Recensione Lenovo Idea Tab Plus: il tablet da 12...
Intelligenza artificiale: le Big Tech sa...
Xbox Game Pass, il mese di luglio 2026 s...
Smartphone troppo cari: Qualcomm ripensa...
Age of Empires III: Definitive Edition t...
GitHub contro i report fatti dall'IA: ri...
Google spinge sugli schermi ultra-wide: ...
Occhiali smart, Instagram bannerà chi re...
L'UE approva PRIMA: il chip fotovoltaico...
Nothing smentisce l'uscita da alcuni mer...
Tassa sui pacchi extra-UE, Giorgetti: da...
Jensen Huang esordisce su X: 'non mettet...
Ha reso lo smartphone e Amazon lo ha 'pe...
TOP 10 offerte del weekend Amazon: ai pr...
TV LG C6 e B5 da 55 pollici: due OLED da...
Tomb Raider: Catalyst rinviato al 2028, ...
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: 07:31.


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