Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Nioh 3: souls-like punitivo e Action RPG
Nioh 3: souls-like punitivo e Action RPG
Nioh 3 aggiorna la formula Team NINJA con aree esplorabili più grandi, due stili di combattimento intercambiabili al volo (Samurai e Ninja) e un sistema di progressione pieno di attività, basi nemiche e sfide legate al Crogiolo. La recensione entra nel dettaglio su combattimento, build, progressione e requisiti PC
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti
La facilità di installazione e la completa automazione di tutte le fasi di utilizzo, rendono questo prodotto l'ideale per molti clienti. Ecco com'è andata la nostra prova in anteprima
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto
be quiet! debutta nel settore mouse da gaming con Dark Perk Ergo e Dark Perk Sym: due modelli gemelli per specifiche, con polling rate di 8.000 Hz anche in wireless, sensore PixArt PAW3950 da 32.000 DPI e autonomia dichiarata fino a 110 ore. Nel test, a 8.000 Hz si arriva a circa 30 ore reali, con ricarica completa in un'ora e mezza
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 01-10-2012, 15:59   #1
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
[C++]confrontare 2 stringhe

Ciao a tutti ragazzi mi date una mano per favore a capire questo programma?

Ci sono alcune cose che non ho capito e spero nel vostro aiuto e spiegazione per allontanarmi da ciò che c'è scritto sul libro che non riesco a mettere in pratica.
Questo è un programma che deve confrontare 2 stringhe

Considerando quel main potete dirmi perchè ci sono 3 costruttori?
quello a 0 argomenti, quello con argomenti e quello di copia


Codice:
#ifndef _STRINGA_H_
#define _STRINGA_H_

#include <iostream>
#include <stdlib.h>

using namespace std;

class Stringa{
      
      private:
              char* str;
              int l;//lunghezza stringa
      public:
             Stringa():str(0){};
             Stringa(const char*);
             Stringa(const Stringa &);
             ~Stringa() {delete [] str;}
             
             int Lunghezza() const {return l;}
             void Stampa() const {cout<<str;}
             
             const Stringa& operator=(const Stringa&);
             bool operator==(const Stringa&);
             
             friend ostream& operator<<(ostream& out,const Stringa &s) { s.Stampa(); return out;}
             
             
             };
potreste spiegarmi cosa fanno le implementazioni dei 2 costruttori?
commento a lato per evidenziare cosa ho capito

Codice:
#include "string.h"



Stringa::Stringa(const char* sr){
     const char* app = sr;          //inizializzo puntatore a carattere con sr
     l=0;                                 //lunghezza stringa nulla
     while(*app++) l++;           //mentre il puntatore avanza, aumenta la lunghezza


     app = sr;                                  //questa non l'ho capita
     str = new char[l+1];// per il temrinatore  ???ma che vuol dire?  
     char* app2 = str;
     while (*app2++=*app++);
} 



Stringa::Stringa(const Stringa & s){
     const char* app = s.str;
     l=s.l;
     str = new char [l+1];
     char* app2 = str;
     while (*app2++ = *app++);
}



const Stringa& Stringa::operator=(const Stringa& s){
     if(this == &s); //self-assignment(a=a);
     else{
          delete [] str;
          const char* app = s.str;
          l=s.l;
          str = new char [l+1];
          char* app2 = str;
          while (*app2++ = *app++);
     }
     return *this;
}
        
        
          
bool Stringa::operator==(const Stringa& s){
     if(l != s.l) return false;
     else{
          char* app = str;
          char* app2 = s.str;
          for(;*app == *app2 && *app != '\0';*app++,*app2++);
          if( *app == '\0' && *app2=='\0') return true;
          else return false;
     }
}
perchè c'è un overload dell'operatore di assegnamento e di confronto?
mi potreste spiegare la loro implementazione cosa fa di preciso?




Codice:
#include "string.h"




int main(){
    
    Stringa s1("ciao");
    Stringa s2("gatto ");
    cout<<s1<<endl;
    cout<<s2<<endl;
    
    if( s1 == s2) cout<<"\nuguali"; else cout<<"\ndiversi";
    
    
    system("pause");
    return 0;
    
}
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2012, 16:31   #2
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Allora, andiamo per passi:

Quote:
Originariamente inviato da Bandit Guarda i messaggi

Considerando quel main potete dirmi perchè ci sono 3 costruttori?
quello a 0 argomenti, quello con argomenti e quello di copia
Non capisco la domanda. Il costruttore per copia (il terzo) quando si hanno campi puntatore (come in questo caso) bisogna sempre scriverlo, o almeno è buona pratica farlo. Questo perchè è il costruttore utilizzato quando ad un metodo/funzione si passa come argomento un istanza di quella classe.

Quello senza argomenti ovviamente inizializza la stringa ad una stringa nulla (in quanto azzera il puntatore a char "str".

Il secondo infine inizializza la stringa fornendogli una stringa in stile c.

Riguardo al codice:

Codice:
     app = sr;
A quel punto del codice il puntatore app si trova a puntare il carattere nullo della stringa sr, in quanto è stato utilizzato per l'appunto per contare i caratteri non nulli contenuti in sr. Con quella riga di codice il programmatore semplicemente torna a far puntare app al primo carattere della stringa sr.

Codice:
     str = new char[l+1];
Qui alloca lo spazio necessario, comprensivo del carattere nullo finale.


Codice:
     char* app2 = str;
     while (*app2++=*app++);
E qui va a copiare tutti i caratteri della stringa str (usando app2, un puntatore al suo primo carattere) comprensivo dell'ultimo carattere nullo (infatti il while in oggetto termina non appena ha copiato il carattere nullo).


Quote:
perchè c'è un overload dell'operatore di assegnamento e di confronto?
mi potreste spiegare la loro implementazione cosa fa di preciso?
Perchè è pratico utilizzare la sintassi dell' "=" e del "==" quando si manipolano oggetti di una classe definita dall'utente. Più per famigliarità con la scrittura che per un reale vantaggio (la stessa cosa si potrebbe fare definendo semplicemente un metodo d'istanza che fa la stessa cosa degli operatori).
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2012, 17:43   #3
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
Veramente grazie per ciò che hai scritto, non sai quanto mi stai aiutando grazie mille

Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Allora, andiamo per passi:

Non capisco la domanda. Il costruttore per copia (il terzo) quando si hanno campi puntatore (come in questo caso) bisogna sempre scriverlo, o almeno è buona pratica farlo. Questo perchè è il costruttore utilizzato quando ad un metodo/funzione si passa come argomento un istanza di quella classe.
Quando si hanno campi puntatori? cioè dove lo noti, nell'implementazione dei costruttori? o da quale altra parte? Perchè vedendo il main , forse mi sarei fermata al costruttore con 1 argomento.


Quote:
Perchè è pratico utilizzare la sintassi dell' "=" e del "==" quando si manipolano oggetti di una classe definita dall'utente. Più per famigliarità con la scrittura che per un reale vantaggio (la stessa cosa si potrebbe fare definendo semplicemente un metodo d'istanza che fa la stessa cosa degli operatori).
ok però dal main vedo che si usa solo l'overloading del confronto non l'altro di assegnamento.




Cerco di spiegarmi prima l'implementazione dell'operatore di assegnamento.
Questo viene implementata come metodo di una classe e quindi ha al primo operando un oggetto della classe stessa, oppure la definivo come funzione esterna (eventualmente dichiarandola friend della classe se accede ai membri privati della classe).
Codice:
const Stringa& Stringa::operator=(const Stringa& s){
     if(this == &s); //self-assignment(a=a);  //se il puntatore all'oggetto stringa ha lo stesso indirizzo della stringa s. Non fa nulla
     else{   
          delete [] str;          //oppure cancella l'estensione dinamica di str
          const char* app = s.str;   //assegna ad app la stringa str (come l'operazione che mi hai spiegato prima)

          l=s.l;  //questa non l'ho capita
          str = new char [l+1];    

//queste operazioni sono quelle che mi hai detto prima
          char* app2 = str;
          while (*app2++ = *app++);
     }
     return *this;    //ritorna l'oggetto stesso, poichè il risultato dell'operazione è l'oggetto stesso
}
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2012, 17:59   #4
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da Bandit Guarda i messaggi
Quando si hanno campi puntatori? cioè dove lo noti, nell'implementazione dei costruttori? o da quale altra parte? Perchè vedendo il main , forse mi sarei fermata al costruttore con 1 argomento.
Nel caso specifico della classe che stai analizzando, viene utilizzato un puntatore a char (char* str) per contenere i caratteri della stringa.
Per questo serve un costruttore per copia, perchè se non specificato dall'utente viene generato un costruttore per copia di default. Questo non fa altro che eseguire una copia membro per membro.
Puoi immaginare come questa operazione sia errata nel caso di un campo puntatore, in quanto si andrebbe a copiare solo il puntatore stesso, cioè l'indirizzo del primo carattere della stringa memorizzata. Questo porterebbe le due istanze a puntare alla stessa stringa in memoria, e quindi le operazioni sulla prima avrebbero ripercussioni anche sulla seconda.
Per questo si va a specificare un costruttore per copia, così da cambiare questo comportamento e far si che venga generata una stringa completamente nuova (per l'appunto una copia).


Quote:
ok però dal main vedo che si usa solo l'overloading del confronto non l'altro di assegnamento.
Nel main evidentemetne non viene utilizzata la funzionalità di assegnamento ma viene mostrata solo quella di confronto.


Codice:
          l=s.l;  //questa non l'ho capita
          str = new char [l+1];
Semplicemente viene aggiornato il parametro l, ponendolo uguale al parametro l della istanza s.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2012, 18:17   #5
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
Quote:
Originariamente inviato da [Kendall] Guarda i messaggi
Nel caso specifico della classe che stai analizzando, viene utilizzato un puntatore a char (char* str) per contenere i caratteri della stringa.
Per questo serve un costruttore per copia, perchè se non specificato dall'utente viene generato un costruttore per copia di default. Questo non fa altro che eseguire una copia membro per membro.
Puoi immaginare come questa operazione sia errata nel caso di un campo puntatore, in quanto si andrebbe a copiare solo il puntatore stesso, cioè l'indirizzo del primo carattere della stringa memorizzata. Questo porterebbe le due istanze a puntare alla stessa stringa in memoria, e quindi le operazioni sulla prima avrebbero ripercussioni anche sulla seconda.
Per questo si va a specificare un costruttore per copia, così da cambiare questo comportamento e far si che venga generata una stringa completamente nuova (per l'appunto una copia).
C'è spiegato la stessa cosa sul libro, ma ti dico che sei stato molto più chiaro tu
questo è stato un ottimo caso per specificare il problema che hai posto.



Quote:

Semplicemente viene aggiornato il parametro l, ponendolo uguale al parametro l della istanza s.
scusa , ma a che serve non capisco. Poichè sono due stringhe diverse la lunghezza cioè l, è diversa e perciò si assegna l'una all'altra?





Anche per questo vale ciò che ho scritto prima
"Questo viene implementata come metodo di una classe e quindi ha al primo operando un oggetto della classe stessa, oppure la definivo come funzione esterna (eventualmente dichiarandola friend della classe se accede ai membri privati della classe)."

ma perchè viene definita in questo modo in bool e non con Stringa &

Codice:
          
bool Stringa::operator==(const Stringa& s){
     if(l != s.l) return false;    //se le due lunghezze son diverse return false
     else{
          char* app = str;   //copia le due stringhe in app e app2
          char* app2 = s.str;
          for(;*app == *app2 && *app != '\0';*app++,*app2++);
//il primo ; non l'ho capito, per le due strighe che sono uguali e per il puntatore app che non ha ancora raggiunto l'ultimo carattere, incrementa i due puntatori


          if( *app == '\0' && *app2=='\0') return true;
//se i due puntatori puntano al carattere terminazione ,quindi stringhe vuote return true
          else return false;
     }
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2012, 20:30   #6
sottovento
Senior Member
 
L'Avatar di sottovento
 
Iscritto dal: Nov 2005
Città: Texas
Messaggi: 1722
Attenzione - Si tratta di un programma di esempio, a puro scopo didattico.
Il codice, infatti, non e' sicuro e potrebbe portare a problemi (i.e. crash) se usato in un software "vero".
__________________
In God we trust; all others bring data
sottovento è offline   Rispondi citando il messaggio o parte di esso
Old 01-10-2012, 21:27   #7
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da Bandit Guarda i messaggi
scusa , ma a che serve non capisco. Poichè sono due stringhe diverse la lunghezza cioè l, è diversa e perciò si assegna l'una all'altra?
Sono diverse a livello di istanze (nel senso che ognuna di esse occupa una distinta parte della memoria ed è pertanto indipendente dall'altra), ma il contenuto è il medesimo. Stiamo parlando dell'operatore di assegnamento d'altro canto, lui DEVE copiare il contenuto ergo la nuova stringa sarà formalmente la stessa (e quindi della stessa lunghezza).


Quote:
ma perchè viene definita in questo modo in bool e non con Stringa &

Codice:
          
bool Stringa::operator==(const Stringa& s){
     if(l != s.l) return false;    //se le due lunghezze son diverse return false
     else{
          char* app = str;   //copia le due stringhe in app e app2
          char* app2 = s.str;
          for(;*app == *app2 && *app != '\0';*app++,*app2++);
//il primo ; non l'ho capito, per le due strighe che sono uguali e per il puntatore app che non ha ancora raggiunto l'ultimo carattere, incrementa i due puntatori


          if( *app == '\0' && *app2=='\0') return true;
//se i due puntatori puntano al carattere terminazione ,quindi stringhe vuote return true
          else return false;
     }
Attento/a che quello è un operatore di confronto, non di assegnazione. Deve restituire un risultato booleano altrimenti perderebbe il suo senso.
Un riferimento all'istanza stessa lo restituisci nel caso di operatori come quello di uguaglianza, di somma, moltiplicazione, ecc... Questo tra l'altro non è NECESSARIO (potresti restituire anche un void), ma viene utilizzato come tecnica per permettere la concatenazione dell'operazione (es° a * b * c, oppure a = b = c)
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2012, 14:29   #8
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
Grazie Kendall

molto chiaro grazie

ti posso chiedere una spiegazione sul ciclo for dell'overload dell'operatore di confronto?

Poi metto tutto insieme e spero che tutto fili

grzie ancora
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 02-10-2012, 15:07   #9
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da Bandit Guarda i messaggi
Grazie Kendall

molto chiaro grazie

ti posso chiedere una spiegazione sul ciclo for dell'overload dell'operatore di confronto?

Poi metto tutto insieme e spero che tutto fili

grzie ancora
Codice:
for(;*app == *app2 && *app != '\0';*app++,*app2++);
Allora, in quel ciclo for viene fatto questo:
app e app2 sono puntatori a char che all'inizio del ciclo for puntano al carattere iniziale delle rispettive stringhe.
il primo ";" preceduto dal nulla significa banalmente che non viene inizializzato alcun indice o altra variabile (tipo il classico "int i = 0", quindi la condizione di uscita non necessita di variabili aggiuntive).
La condizione " *app == *app2 && *app != '\0' "controlla che il carattere puntato attualmente da app e app2 corrisponda, nonchè che sia diverso dal carattere nullo. Infine vengono fatti avanzare entrambi i puntatori per passare al carattere successivo. In questa maniera il ciclo termine o se viene trovata una differenza nei caratteri, o se viene raggiunta la fine della stringa cioè il carattere nullo (nel primo caso le stringhe son diverse, nel secondo sono uguali).
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2012, 13:46   #10
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
ciao kendall

ora mi è venuto un dubbio


in un altro post , ed in un'altra classe avevo ad esempio

Codice:
char * marca

che quindi nel costruttore avevo
Moto::Moto(const char *mar)
{
    Marca=new char[strlen(mar)+1]
   strcpy(Marca,mar)
}

ritornando al problema poichè nella classe abbiamo
Codice:
char * str
ho anche qui allocazione dinamica di una stringa
perchè poi ho anche
Codice:
str=new char[l+1]
però si va ad eseguire l'operazione di copia cioè strcpy


perchè?

perchè in questo problema si devono solo confrontare le stringhe che lo si fa tramite i puntatori.
PErò poi perchè si sceglie una strada o un altra?
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2012, 17:23   #11
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Quote:
Originariamente inviato da Bandit Guarda i messaggi
ciao kendall

ora mi è venuto un dubbio


in un altro post , ed in un'altra classe avevo ad esempio

Codice:
char * marca

che quindi nel costruttore avevo
Moto::Moto(const char *mar)
{
    Marca=new char[strlen(mar)+1]
   strcpy(Marca,mar)
}

ritornando al problema poichè nella classe abbiamo
Codice:
char * str
ho anche qui allocazione dinamica di una stringa
perchè poi ho anche
Codice:
str=new char[l+1]
però si va ad eseguire l'operazione di copia cioè strcpy


perchè?

perchè in questo problema si devono solo confrontare le stringhe che lo si fa tramite i puntatori.
PErò poi perchè si sceglie una strada o un altra?
A dire il vero la classe di questo thread mi sembra più un esercizio didattico che altro. Come hai notato pure tu esistono diverse potenti funzioni che lavorano sulle stringhe stile c (tutte funzioni ereditate dal c), nonchè membri della classe string (del c++) che spesso e volentieri bastano per quello che può essere un uso comune delle stringhe.

Se ti guardi anche solo la lista di funzioni per la manipolazione di stringhe contenuto nell'header cstring (o string.h se lavori sotto c) vedrai come contenga tutto e molto di più del contenuto della classe che hai analizzato in questo thread.

si parla ovviamente di manipolazioni a basso livello, per un utilizzo più generico delle stringhe ricorda di utilizzare sempre la classe String del c++.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2012, 17:42   #12
Bandit
Senior Member
 
L'Avatar di Bandit
 
Iscritto dal: Sep 2003
Messaggi: 9434
te l'ho chiesto poichè in quell'occasione il costruttore di copia non è stato usato. E questo mi fa pensare


Mi posso per esempio regolare così?se scelgo di implementare con i puntatori allora vado a considerare il costruttore di copia se no , uso quell'altra forma.
Avevo sotto mano un altro esercizio dove appunto c'è il costruttore di copia, però poi l'implementazione non è svolta con i puntatori.

Perciò capisco ciò che mi hai spiegato così chiaramente rispetto al libro

Quote:
Nel caso specifico della classe che stai analizzando, viene utilizzato un puntatore a char (char* str) per contenere i caratteri della stringa.
Per questo serve un costruttore per copia, perchè se non specificato dall'utente viene generato un costruttore per copia di default. Questo non fa altro che eseguire una copia membro per membro.
Puoi immaginare come questa operazione sia errata nel caso di un campo puntatore, in quanto si andrebbe a copiare solo il puntatore stesso, cioè l'indirizzo del primo carattere della stringa memorizzata. Questo porterebbe le due istanze a puntare alla stessa stringa in memoria, e quindi le operazioni sulla prima avrebbero ripercussioni anche sulla seconda.
Per questo si va a specificare un costruttore per copia, così da cambiare questo comportamento e far si che venga generata una stringa completamente nuova (per l'appunto una copia).
però poi mi chiedo sempre, quando lo devo usare questo costruttore?
Il discriminante dei puntatori vengono meno perchè in quest'esercizio che sto visionando adesso non ce ne son. A meno che non li si utilizzi quando ho estensione dinamica.
__________________
1)P4 2.4-Asrock p4i65- Sapphire Hd3450 512mb agp- 2GB ddr400-Hd 80gb WD- Thermaltake Litepower 450W
2)Amd 3200-Msi K8n Neo4 Platinum - 2*512 MB pc3200-Asus N6600gt- HD WD 160GB-enermax noisetacker 370.
Bandit è offline   Rispondi citando il messaggio o parte di esso
Old 03-10-2012, 18:08   #13
[Kendall]
Senior Member
 
L'Avatar di [Kendall]
 
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
Il costruttore per copia, così come l'operatore di assegnamento, lo devi utilizzare quando questo si discosta rispetto al comportamento di default (cioè nel caso nel quale tu non specifichi nulla).

Per default, sia il costruttore per copia che l'operatore di assegnazione fanno una copia membro a membro (con il comportamento che ti ho spiegato prima). Se questo non è ciò che desideri allora devi specificarli da te.
[Kendall] è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Nioh 3: souls-like punitivo e Action RPG Nioh 3: souls-like punitivo e Action RPG
Test in super anteprima di Navimow i220 LiDAR: il robot tagliaerba per tutti Test in super anteprima di Navimow i220 LiDAR: i...
Dark Perk Ergo e Sym provati tra wireless, software via browser e peso ridotto Dark Perk Ergo e Sym provati tra wireless, softw...
DJI RS 5: stabilizzazione e tracking intelligente per ogni videomaker DJI RS 5: stabilizzazione e tracking intelligent...
AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequenze al top per il gaming AMD Ryzen 7 9850X3D: Zen 5, 3D V-Cache e frequen...
Microsoft punta su sicurezza e qualità: ...
ChromeOS è un condannato a morte:...
Robot aspirapolvere Narwal in super offe...
TSMC porterà la produzione a 3 nm...
Overwatch: inizia una nuova era per il t...
Monitor gaming in super offerta su Amazo...
Nuove conferme sui prezzi dei Galaxy S26...
LG OLED 48'' in super offerta su Amazon:...
I MacBook Pro con M5 Pro/Max sono quasi ...
3 Scope elettriche top in offerta su Ama...
ARC Raiders chiude un mese da record: &e...
Droni DJI in offerta su Amazon: Mini 4K ...
La metà degli utenti di Steam usa...
Meta Quest 3S scende di prezzo su Amazon...
Handheld Android con display OLED a 144 ...
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: 10:49.


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