Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 31-01-2004, 13:03   #1
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
[C++]Expr Algebriche

Sto provando a fare un parser di expr matematiche.
Ho creato la mia bella classina ma ho un problema
Codice:
#include <list>
#include <string>

// The expression operator enum
typedef enum
{
	PLUS = 0,
	MINUS,
	DIV,
	MOD
} OpType;

// The Expression
struct ExprOp
{
	OpType op;
	std::string op1;
	std::string op2;
	ExprOp(const std::string &Op1, const std::string &Op2, OpType Op)
	{
		op1 = Op1;
		op2 = Op2;
		op =  Op;
	}
};

typedef std::list<ExprOp *> Expression;
typedef std::list<ExprOp *>::iterator Expression_it;

class CExprParse
{
	private:
		std::string ris;
		Expression expr;
		bool ParseEspr(const std::string &value);
	public:
		CExprParse();
		~CExprParse();
		CExprParse(CExprParse &p);
		bool Exec();
		inline const std::string Get();
		bool addExpr(const std::string &value);
};

CExprParse::CExprParse()
{
}

CExprParse::CExprParse(CExprParse &p)
{
	// no autoassignment
	if(&p != this)
	{
		// TODO
	}
}

CExprParse::~CExprParse()
{
}

bool CExprParse::ParseEspr(const std::string &value)
{
	unsigned int plus_loc =  value.find( "+", 0 );
	unsigned int minus_loc = value.find( "-", 0 );
	unsigned int div_loc =   value.find( "/", 0 );
	if(plus_loc != std::string::npos) 
	{
		expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ),PLUS));
		return true;
	}
  else if(minus_loc != std::string::npos)
	{
		expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ), MINUS));
		return true;
	}
  else if(div_loc != std::string::npos)
  {
  	expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ), DIV));
  	return true;
  }else
  {
  	return false;
  }
}

bool CExprParse::addExpr(const std::string &value)
{
	return (ParseEspr(value));
}

bool CExprParse::Exec()
{
	std::string tmp("");
	ExprOp * ex;
	// IF EMPTY EXIT
	if(expr.empty())
		return false;
	while(!expr.empty())
	{
		// RETURN THE PART OF EXRESSION TO EXECUTE
		ex = expr.front();
		//////////////////////////////////////////
		///////// CHECK THE LITTERAL /////////////
		//std::string f_l = ;
		//std::string s_l = ;
		/*
			if(f_l == s_l) // ax + bx
			{
				switch(ex.op)
				{
					case PLUS:
						break;
					case MINUS:
						break;
					case DIV:
						break;
				}
			}else // ax + by
			{
        switch(ex.op)
				{
					case PLUS:
						break;
					case MINUS:
						break;
					case DIV:
						break;
				}
			}
		*/
		//////////////////////////////////////////
		//////////CHECK THE NUMBERICAL ///////////
		//int fist = static_cast< int >();
		//int second = static_cast< int >();
		//////////////////////////////////////////
		////////// EXEC THE OPERARATION //////////
		
		// REMOVE THE ELEMENT
		expr.pop_front();
	}
	return true;
}

const std::string CExprParse::Get()
{	
	if(Exec())
		return ris;
	else
 		new std::string("Can't execute the expression\n");	
}
Come proseguo????
La mia implementazione del metodo Exec va bene????

Tnk 10000000000000
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 14:31   #2
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Non del tutto, non tanto per alcuni errori che ho notato qua e la' (quando prendi le sottostringhe ad esempio l'operazione finisce da une delle due parti), ma per l'approccio.
Per prima cosa ti interessa valutare singole operazioni (x+y o a/b ad esempio) o espressioni complete come a+b*c ? Mi sembra che la tua implementazione funzioni solo nel primo caso.
Secondo me una cosa che potresti fare (ed e' quella che si fa di solito) e' quella di distinguere per prima cosa i numeri dalle operazioni, non andando a caccia delle operazioni, ma identificando gli elementi della espressione "da destra a sinistra", e creare degli oggetti (tokens) che li rappresentino. Da li' in poi procedere infine all'analisi vera e propria.
Ad esempio potresti fare un oggetto del genere
Codice:
enum token_type{ NUMBER , SUM , SUB , MUL , DIV };

struct Token
{
	Token(token_type t):type(t){}
	Token(int i):value(i){}
	token_type type;
	int value; // solo per il NUMBER
};
e scriverti una funzione del tipo
Codice:
template<class It>
vector<Token> lex( It begin , It end  )
{
	vector<Token> result;
	while( begin != end )
	{
		"controlla cosa c'e' all'inizio dell'input"
		switch( "tipo" )
		{
		case "numero":
			result.push_back( Token(numero) );
			break;
		case '+':
			result.push_back( Token(SUM) );
			...
		}
		"Togli il valore appena trovato dall'input aggiornando 'begin'"
	}
	return result;
}
Il trucco e' non andare in cerca di '+' ma controllare cosa c'e' all'inizio (c'e' un '+' ? e' una somma, c'e' una cifra ? E' l'inizio di un numero ... ), aggiungere man mano alla lista e continuare con quel che ti rimane

fatto questo ottieni una lista gia' un po' strutturata dell'input
cosi' che ottieni qualcosa di indipendente dal numero di cifre e/o di spazi che hai, ti aiutera' inoltre ad individuare errori (cosa succede col tuo programa se scrivo "12 32 + 27" ?)
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 14:37   #3
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
ho pensato di implementare meglio cosi:
Codice:
#include <list>
#include <string>

// The expression operator enum
typedef enum
{
	PLUS = 0,
	MINUS,
	DIV,
	MOD
} OpType;

// The Expression
struct ExprOp
{
	OpType op;
	std::string op1;
	std::string op2;
	ExprOp(const std::string &Op1, const std::string &Op2, OpType Op)
	{
		op1 = Op1;
		op2 = Op2;
		op =  Op;
	}
};

typedef std::list<ExprOp *> Expression;
typedef std::list<ExprOp *>::iterator Expression_it;

class CExprParse
{
	private:
		std::string ris;
		Expression expr;
		bool ParseEspr(const std::string &value);
	public:
		CExprParse();
		~CExprParse();
		CExprParse(CExprParse &p);
		bool Exec();
		inline const std::string Get();
		bool addExpr(const std::string &value);
};

CExprParse::CExprParse()
{
}

CExprParse::CExprParse(CExprParse &p)
{
	// no autoassignment
	if(&p != this)
	{
		// TODO
	}
}

CExprParse::~CExprParse()
{
}

bool CExprParse::ParseEspr(const std::string &value)
{
	unsigned int plus_loc =  value.find( "+", 0 );
	unsigned int minus_loc = value.find( "-", 0 );
	unsigned int div_loc =   value.find( "/", 0 );
	if(plus_loc != std::string::npos) 
	{
		expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ),PLUS));
		return true;
	}
  else if(minus_loc != std::string::npos)
	{
		expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ), MINUS));
		return true;
	}
  else if(div_loc != std::string::npos)
  {
  	expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ), DIV));
  	return true;
  }else
  {
  	return false;
  }
}

bool CExprParse::addExpr(const std::string &value)
{
	return (ParseEspr(value));
}

bool CExprParse::Exec()
{
	std::string tmp("");
	ExprOp * ex;
	// IF EMPTY EXIT
	if(expr.empty())
		return false;
	while(!expr.empty())
	{
		// RETURN THE PART OF EXRESSION TO EXECUTE
		ex = expr.front();
		unsigned int x_loc =   ex->op1.find( "x", 0 );
		unsigned int y_loc =   ex->op1.find( "y", 0 );
		unsigned int x2_loc =  ex->op2.find( "x", 0 );
		unsigned int y2_loc =  ex->op2.find( "y", 0 );
		if(x_loc != std::string::npos && x2_loc != std::string::npos) // ax + bx
		{
			/*
				ax + bx
				\
				 (a + b)x
				  \
				   abx
				a = op1.substr(0, x_loc);
				b = op2.substr(0, x2_loc);
			*/
		}
    else if(x_loc != std::string::npos && y2_loc != std::string::npos) // ax + by
		{
		/*
				ax + by
				\
		     \
				   ax by
				a = op1.substr(0, x_loc);
				b = op2.substr(0, y2_loc);
			*/
		}
		else if((x_loc == std::string::npos && y2_loc != std::string::npos)) // ay + by
		{
			/*
				ay + by
				\
				 (a + b)y
				  \
				   aby
				a = op1.substr(0, y_loc);
				b = op2.substr(0, y2_loc);
			*/
		}
		expr.pop_front();
	}
	return true;
}

const std::string CExprParse::Get()
{	
	if(Exec())
		return ris;
	else
 		new std::string("Can't execute the expression\n");	
}
Lo logica dei commmenti in exec è ok???


Tnk
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 16:16   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Ma l'albero di derivazione non te lo sei costruito ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 17:13   #5
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
volevo fare solo una prova x le addizioni con le liste.
Ho sbagliato???
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 17:46   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Se funziona va bene
Comunque studiati come costruire l'albero di derivazione... Fai 10 volte prima ad interpretare l'espressione...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 17:58   #7
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da cionci
Se funziona va bene
Comunque studiati come costruire l'albero di derivazione... Fai 10 volte prima ad interpretare l'espressione...
Era un esercizio per usare gli enum e altre cosette appena studiate......anche se nnandra avro imparato qualcosa
Cmq se prova ad usare la classe mi termina immediatamente
P.S: davvero va bene??
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 18:02   #8
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Luc@s
Cmq se prova ad usare la classe mi termina immediatamente
Debuggalo
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 18:04   #9
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da cionci
Debuggalo
hai PVT.
Cmq nn sono molto esperto in fatto debug
Qello del VC++ 6 va bene da usare???
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 18:16   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Luc@s
Qello del VC++ 6 va bene da usare???
IMHO il migliore...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 18:18   #11
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da cionci
IMHO il migliore...
Bene cosi imparero qualcosa di + sul debug.
Pvt???
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 18:25   #12
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
cmq questo è il cod finale:
Codice:
 
#include <list>
#include <string>

// The expression operator enum
typedef enum
{
	PLUS = 0,
	MINUS,
	DIV,
	MOD
} OpType;

// The Expression
struct ExprOp
{
	OpType op;
	std::string op1;
	std::string op2;
	ExprOp(const std::string &Op1, const std::string &Op2, OpType Op)
	{
		op1 = Op1;
		op2 = Op2;
		op =  Op;
	}
};

typedef std::list<ExprOp *> Expression;
typedef std::list<ExprOp *>::iterator Expression_it;

//////////////////////////////////////////////////////////////////////////
// The Expression Class													//
//////////////////////////////////////////////////////////////////////////

class CExprParse
{
	private:
		std::string ris;
		Expression expr;
		bool ParseEspr(const std::string &value);
	public:
		CExprParse();
		~CExprParse();
		bool Exec();
		inline const std::string Get();
		bool addExpr(const std::string &value);
};

CExprParse::CExprParse()
{
	ris = "";	
}

CExprParse::~CExprParse()
{
}

bool CExprParse::ParseEspr(const std::string &value)
{
	unsigned int plus_loc =  value.find( "+", 0 );
	unsigned int minus_loc = value.find( "-", 0 );
	unsigned int div_loc =   value.find( "/", 0 );
	if(plus_loc != std::string::npos) 
	{
		expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ),PLUS));
		return true;
	}
  else if(minus_loc != std::string::npos)
	{
		expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ), MINUS));
		return true;
	}
  else if(div_loc != std::string::npos)
  {
  	expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ), DIV));
  	return true;
  }else
  {
  	return false;
  }
}

bool CExprParse::addExpr(const std::string &value)
{
	return (ParseEspr(value));
}

bool CExprParse::Exec()
{
	// THIS FUNCTION MAKE ONLY PLUS OPERATION
	ExprOp * ex;
	// IF EMPTY EXIT
	if(expr.empty())
		return false;
	unsigned int 
  x_loc,
  y_loc,
  x2_loc,
  y2_loc;
	while(!expr.empty())
	{
		// RETURN THE PART OF EXRESSION TO EXECUTE
		ex =      expr.front();
		x_loc =   ex->op1.find( "x", 0 );
		y_loc =   ex->op1.find( "y", 0 );
		x2_loc =  ex->op2.find( "x", 0 );
		y2_loc =  ex->op2.find( "y", 0 );
		if(x_loc != std::string::npos && x2_loc != std::string::npos) // ax + bx
		{
			/*
				ax + bx
				\
				 (a + b)x
				  \
				   abx
				a = op1.substr(0, x_loc);
				b = op2.substr(0, x2_loc);
			*/
			std::string 
      a_s = ex->op1.substr(0, x_loc),
			b_s = ex->op2.substr(0, x2_loc);
			const char 
      * a = a_s.c_str(), 
      * b = b_s.c_str();
			int tot = (int)a + (int)b;
			ris += tot;
			ris += "x"; 
		}
    else if(x_loc != std::string::npos && y2_loc != std::string::npos) // ax + by
		{
		/*
				ax + by
				\
		     \
				   ax by
				a = op1.substr(0, x_loc);
				b = op2.substr(0, y2_loc);
			*/
			ris += ex->op1;
			ris += ex->op2; 
		}
		else if((y_loc != std::string::npos && y2_loc != std::string::npos)) // ay + by
		{
			/*
				ay + by
				\
				 (a + b)y
				  \
				   aby
				a = op1.substr(0, y_loc);
				b = op2.substr(0, y2_loc);
			*/
			std::string 
      a_s = ex->op1.substr(0, y_loc),
			b_s = ex->op2.substr(0, y2_loc);
			const char * a = a_s.c_str(), * b = b_s.c_str();
			int tot = (int)a + (int)b;
			ris += tot;
			ris += "y"; 
		}
		expr.pop_front();
	}
	return true;
}

const std::string CExprParse::Get()
{	
	if(Exec())
		return ris;
	else
 		new std::string("Can't execute the expression\n");	
}
Nn so perche ma se provo addExpr mi da abnormal termination
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 18:56   #13
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Codice:
if(plus_loc != std::string::npos)
{
  expr.push_back(new ExprOp(value.substr( 0, minus_loc ), value.substr( minus_loc, value.size() ),PLUS));
  return true;
}
Sempre stare molto attenti al copia-e-incolla selvaggio !
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:02   #14
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Quote:
Originariamente inviato da Luc@s
Nn so perche ma se provo addExpr mi da abnormal termination
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:04   #15
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
Ora mia da errore
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:06   #16
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
eh, dove ?
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:11   #17
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
no anzi.
Risolto.
Tnk

Per i nomi ................. come dovrei chiamarle le var???
Mentre l'ordine è ok, no?
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:14   #18
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
un nome tale che se riguardi il codice dopo una settimana che non lo tocchi capisci ancora cosa fa
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:22   #19
Luc@s
Senior Member
 
L'Avatar di Luc@s
 
Iscritto dal: Apr 2002
Città: Vigevano(PV)
Messaggi: 2124
ora mi da il ris in athac..................why?
Immagini allegate
File Type: gif untitled.gif (2.9 KB, 4 visite)
__________________
Gnu/Linux User
Luc@s è offline   Rispondi citando il messaggio o parte di esso
Old 31-01-2004, 19:27   #20
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Debug debug debug

F9 per emttere i break point
F5 per far girare il programma in debug (l'esecuzione si ferma sui break point)
F11 e F10 per andare passo-passo
Aggiungi i watch (scrivi il nome della variabile o l'espressione da valutare)...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
La prima missione orbitale del razzo spa...
Servizi in streaming sempre più c...
Anteprima della Leapmotor B03X: inizia l...
Anthropic accusa la Cina: Claude utilizz...
I satelliti Rassvet (Starlink russo) di ...
Un agente IA ha risolto un problema su W...
Cina: la CMSA potrebbe cambiare parte de...
68 mensilità di bonus per i dipen...
Rocket Lab ha fatto ricorso contro la de...
Nutanix rende disponibile Azure Virtual ...
Il padrino del deep learning avverte: gl...
Il finto avviso "iPhone Storage is Full"...
Dietrofront in Cina, addio touchscreen p...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
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: 05:54.


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