Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione
OPPO ha portato in Italia, dal 1° luglio 2026, Reno16 Pro: display AMOLED da 6,32 pollici a 144Hz, tripla fotocamera con sensore principale da 200 megapixel, chip Dimensity 8550 Super e batteria da 6000mAh, al prezzo di lancio di 899 euro. Lo abbiamo provato per due settimane insieme al nuovo accessorio Bubble, per capire se la formula compatta della serie regge ancora di fronte a un listino da 1099 euro
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco
MiniLED di fascia media con local dimming a 192 zone, 144 Hz nativi e audio firmato Devialet. La prova strumentale riscontra colori affidabili e gaming reattivo, per un prodotto molto accessibile e convincente. Ma la soundbar aggiuntiva è quasi d'obbligo
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto
Amazon porta i colori sul suo Kindle da scrittura più grande: schermo Colorsoft a 11 pollici, processore quad-core, penna premium più reattiva e strumenti IA per le note, sono le note salienti. Il salto di prezzo rispetto al modello in bianco e nero si fa sentire, anche se la percezione è quella di trovarsi di fronte a un prodotto di fascia altissima, per veri appassionati
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


Reno16 Pro: il compatto di OPPO punta su fotocamera da 200MP e il nuovo Bubble! La recensione Reno16 Pro: il compatto di OPPO punta su fotocam...
 Hisense 55U7SE: tuttofare e accessibile, il MiniLED per film, sport e gioco Hisense 55U7SE: tuttofare e accessibile, il Min...
Kindle Scribe Colorsoft: riduce le cornici e diventa a colori, ma il prezzo è alto Kindle Scribe Colorsoft: riduce le cornici e div...
L'IA cambia tutte le regole della sicurezza tra vulnerabilità e sorveglianza. Intervista al CEO di Proofpoint L'IA cambia tutte le regole della sicurezza tra ...
L'Europa conta nella tecnologia e può essere autonoma. Cosa si è detto al Nextcloud Summit 2026 L'Europa conta nella tecnologia e può ess...
Anche T-Mobile abbandona VMware e migra ...
In Italia crescono gli investimenti nell...
Samsung combina IA e quantum computing p...
Anthropic ammette: Claude Code usa un ap...
L'IA costa sempre di più: AWS aum...
Google prepara il blocco delle app non v...
Amazfit aggiorna il Cheetah 2 Ultra: ric...
L'FAA apre ai voli commerciali supersoni...
Amazon ha già abbastanza satelliti per a...
A2A ed Equinix uniscono le forze per rec...
Apple ha creato la crisi delle memorie? ...
GPU subito in cambio di una quota dei ri...
Firefly Aerospace potrà lanciare ...
Intesa Sanpaolo sposta i sistemi IT core...
Visa, Mastercard e Coinbase lanciano Ope...
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: 00:08.


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