Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi
Mate X7 rinnova la sfida nel segmento dei pieghevoli premium puntando su un design ancora più sottile e resistente, unito al ritorno dei processori proprietari della serie Kirin. L'assenza dei servizi Google e del 5G pesa ancora sull'esperienza utente, ma il comparto fotografico e la qualità costruttiva cercano di compensare queste mancanze strutturali con soluzioni ingegneristiche di altissimo livello
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
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 30-12-2007, 12:06   #1
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
[C] Passaggio array a funzione

Dal titolo il problema sembrerebbe semplice ma spiegando meglio credo che sia ancora piu semplice. Sto utilizzando del codice al cui interno è presente una funzione con la seguente intestazione:
Codice:
void func(double *p, double *x, int m, int n, void *data)
L'autore inserito una variabile aggiuntiva non utilizzata all'interno della funzione per permettere a chiunque di aggiungere una propria variabile. Il problema nasce nel momento in cui io voglio fare una cosa del genere:
Codice:
void func(double *p, double *x, int m, int n, double *data1, double *data2, double *data2)
Ovviamente questo mi da errore poiche la funzione non è definita cosi in tutte le altre parti del programma. A questo punto non so se è giusto e vantaggioso andare a modificare tutte le intestazioni della funzione presente nei vari file .c e .h oppure trovare una soluzione migliore al problema.
In un primo momento avevo pensato di inserire all'interno della funzione la lettura dei file e creare li dentro gli array di cui ho bisogno. Questa soluzione salvo mie sviste non è possibile poiche ci deve essere all'interno del programma un ciclo for che mi fa eseguire la lettura n volte.
Volevo sapere una vostra idea sulla soluzione di questo problema. Per adesso ancora non ho provato ma cercando su internet ho trovato questa soluzione, ditemi se è giusta:

Codice:
typedef double **matrice;
matrice data;             /* Dichiara la matrice    */

    ...                /* Trova il valore di n */

a = calloc(dim1, sizeof *a);        /* Alloca vettore di puntatori */
if ( !a ) { ... }
for (i=0: i<n: i++) {
   a[i] = calloc(dim2, sizeof *a)       /* Alloca i-esima riga */
   if ( !a[i] ) { ... }
}

...                /* Usa la matrice */
for (i=0; i<n; i++)              /* Libera la memoria */
      free(a[i]);
free(a);
Un solo dubbio : la prima calloc mi genera il numero di colonne mentre la seconda il numero di righe? Quindi nel mio caso avendo tre array dovrei fare una cosa del genere:
Codice:
dim1=3;
dim2=numero_punti;
Giusto?
Grazie a tutti.
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."

Ultima modifica di salvodel : 02-01-2008 alle 09:21.
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2008, 09:29   #2
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
# How can I pass my own data?

Assume that you want to pass two arrays, one of doubles and one of integers. A quick but not very elegant solution is to use global variables. The simplest way to avoid using globals is to declare a structure as

struct mydata{
double dar[XXX];
int iar[YYY];
};

where XXX and YYY denote the appropriate array sizes. Then, define a structure variable with

struct mydata data;

and fill it:

data.dar[0]=7.0;
data.iar[0]=-17;
// etc

Following this, call the appropriate LM routine passing it the address of data as the adata argument, e.g.

ret=dlevmar_der(func, fjac, ..., (void *)&data);

Your func and fjac routines should interpret the supplied data using type casting:

struct mydata *dptr;

dptr=(struct mydata *)adata; // adata is passed as void *


// supplied data can now be accessed as dptr->dar[0], etc


Ho trovato questa soluzione ma non ho ben capito i passaggi nelle righe finali. Nella prima parte crea una struttura dati e passa l'indirizzo. Successivamente fa il type casting ma non ho capito bene. Provo ascrivere come ho capito:

Codice:
struct mydata
{
	double vet1[100];
	double vet2[100];
}

.....

struct mydata dati;
Alla funzione incriminata passo l'indirizzo di dati. All'interno della funzione faccio il type casting?
Cioè mi ricreo una nuova variabile
Codice:
struct mydata *dati_fun;
faccio il type casting
Codice:
dati_fun=(struct mydata *)?????
All'interno della funzione accedo ai dati con
Codice:
dati_fun.vet1[];
dati_fun.vet2[];
Dove cisono i punti interrogativi non mi è chiaro il passaggio.
Grazie a tutti e buon inizio anno.
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."

Ultima modifica di salvodel : 02-01-2008 alle 09:48.
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2008, 10:42   #3
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
Allora...

struct MyData {
double *data1;
double *data2;
double *data3;
double *data4;
double *data5;
} data;

data.data1 = myData1;
...
...
data.data5 = myData5;

func(a, b, c, d, e, (void *)&data);

Dentro a func ovviamente se vuoi usare i tuoi dati devi ottenere nuovamente il puntatore alla struttura:

struct MyData *myData = (struct MyData *)data; //data è il puntatore a void passato

A questo punto puoi utilizzare come vuoi la struttura con myData->data1...etc etc
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2008, 16:21   #4
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
A questo punto puoi utilizzare come vuoi la struttura con myData->data1...etc etc
Prima di tutto grazie mille come al solito.
Ho provato a farlo girare ma non va ma credo di aver fatto alcuni errori
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include "lm.h"

#define batch 10
#define stringa "OUTPUT.DAT"

void errore(double *p, double *x, int m, int n, (void *)&data)
{
int ii,jj,kk,t;
int S=10;
struct mydata *matricedati= (struct mydata *)data;

double u[2][batch];
double d[2][batch];
double err;
/*..................*/
}

int main()
{
struct mydata
{
	double vet1[100];
	double vet2[100];
}
struct mydata data;
register int i, j;
int problem, ret;
/*..................*/
ret=dlevmar_dif(errore, p, x, m, n, 1000, opts, info, NULL, NULL, NULL);
/*..................*/
return 0;
}
In rosso ci sono i punti incriminati. Dove c'è NULL devo mettere (void *)&data?
Codice:
extern int dlevmar_dif(
	void (*func)(double *p, double *hx, int m, int n, void *adata),
	double *p, double *x, int m, int n, int itmax, double *opts,
	double *info, double *work, double *covar, void *adata);
La cosa che non mi è chiara è perche devo passare i dati in dlevmar_dif quando a me servono nella funzione errore?
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 02-01-2008, 16:28   #5
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
La funzione la devi definire così:

void errore(double *p, double *x, int m, int n, void *data)
{
}

Il passaggio del parametro lo devi fare con (void *)&data.
Inoltre la struct la devi dichiarare all'esterno del main e prima della definizione di errore.

Mi dici chi ti ha nominato dlevmar_dif ? Non mi sembra di averne mai parlato nel post precedente
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 11:37   #6
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
La funzione la devi definire così:

void errore(double *p, double *x, int m, int n, void *data)
{
}
Questa è gia definita cosi dall'autore ma mi sa che i dati non li devo passare da qui...
Quote:
Originariamente inviato da cionci Guarda i messaggi
Il passaggio del parametro lo devi fare con (void *)&data.
Inoltre la struct la devi dichiarare all'esterno del main e prima della definizione di errore.

Mi dici chi ti ha nominato dlevmar_dif ? Non mi sembra di averne mai parlato nel post precedente
La funzione dlevmar_dif non l'hai citata tu ma era presente nelle FAQ del sito dove l'ho scaricato. Mi sa che devo fare un passaggio per me un po strano.
Correggimi se sbaglio:
Nella dlevmar_dif passo i dati come mi hai detto tu (void *)&data nel terzo NULL in rosso poi credo che lo faccia in automatico la dlevmar_dif il passaggio dei dati alla funzione errore.
Nella funzione errore invece devo mettere
Codice:
struct mydata *matricedati= (struct mydata *)data;
Un ultimo chiarimento
Quote:
Originariamente inviato da cionci Guarda i messaggi
A questo punto puoi utilizzare come vuoi la struttura con myData->data1...etc etc
In C la utilizzo con myData.data1 giusto? quella è la notazione da C++?
Di nuovo grazie
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."

Ultima modifica di salvodel : 03-01-2008 alle 11:47.
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 03-01-2008, 12:52   #7
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 salvodel Guarda i messaggi
Questa è gia definita cosi dall'autore ma mi sa che i dati non li devo passare da qui...
Appunto...sei te che ne codice che hai postato hai modificato l'ultimo parametro in:

void errore(double *p, double *x, int m, int n, (void *)&data)
{
}

Quella modifica non va fatta...
Quote:
La funzione dlevmar_dif non l'hai citata tu ma era presente nelle FAQ del sito dove l'ho scaricato. Mi sa che devo fare un passaggio per me un po strano.
Correggimi se sbaglio:
Nella dlevmar_dif passo i dati come mi hai detto tu (void *)&data nel terzo NULL in rosso poi credo che lo faccia in automatico la dlevmar_dif il passaggio dei dati alla funzione errore.
Evidentemente dlevmar_dif era un nome di funzione d'esempio
(void *)&data lo devi fare nella chiamata della funzione errore, non nella definizione della funziona come avevi messo...
Quote:
Un ultimo chiarimento

In C la utilizzo con myData.data1 giusto? quella è la notazione da C++?
Mi sa che devi ripassarti un po' di C
myData è un puntatore e come tale per accedere agli elementi della struttura dati bisogna usare l'operatore ->.
myData->data1 equivale a (*myData).data1
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:21   #8
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
Mi sa che devi ripassarti un po' di C
Grazie a qualche tua strigliata ed ai molti consigli sono riuscito a risolvere alcuni problemi.
Quote:
Originariamente inviato da cionci Guarda i messaggi
Appunto...sei te che ne codice che hai postato hai modificato l'ultimo parametro in:

void errore(double *p, double *x, int m, int n, (void *)&data)
{
}

Quella modifica non va fatta...

Evidentemente dlevmar_dif era un nome di funzione d'esempio
(void *)&data lo devi fare nella chiamata della funzione errore, non nella definizione della funziona come avevi messo...
Ti scrivo la procedura corretta giusto se ti puo interessare visto che forse non mi sono spiegato bene.
Io scrivo la funzione errore e le operazioni base le fa la funzione dlevmar_dif. Per passare i dati alla funzione errore non devo far altro che passarli alla funzione dlevmar_dif che li passa alla funzione errore.
Il mio problema ora è che quello che faccio dentro la funzione errore mi viene ripetuto troppe volte...ma di questo te ne parlero nelle prossime ore dopo averci sbattutto un bel po la testa.
Grazie
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:24   #9
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
Io non ho capito ancora cos'è questa dlevmar_dif e se fa parte della tua libreria o no
Non è che mi dici come è definita ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:42   #10
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
Io non ho capito ancora cos'è questa dlevmar_dif e se fa parte della tua libreria o no
Non è che mi dici come è definita ?
E' il cuore del programma ed è cosi definita:
Codice:
extern int dlevmar_dif(
	void (*func)(double *p, double *hx, int m, int n, void *adata),
	double *p, double *x, int m, int n, int itmax, double *opts,
	double *info, double *work, double *covar, void *adata);
Come vedi io gli passo la funzione di cui voglio trovare i minimi, nel mio caso la funzione errore. Io sbagliavo il passaggio dei dati proprio qui: li davo nella funzione errore invece li dovevo dare in dlevmar_dif.
Ora ho un dubbio: l'ultimo parametro della func si chiama data ma se faccio come mi dice le

edit
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."

Ultima modifica di salvodel : 04-01-2008 alle 10:50.
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:45   #11
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
Mi fai vedere come richiami il tutto ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 10:53   #12
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
Mi fai vedere come richiami il tutto ?
Per problemi di stabilità avevo inviato e poi stavo facendo un edit.

Ora ho un dubbio: l'ultimo parametro della func si chiama data ma se faccio come mi dice leFAQ mi da errore? Se invece metto data il programma gira e si pianta per altri motivi che adesso andrò ad indagare
Come al solito grazie per l'interessamento. Ti invio il programma spolpato di tutte le cose che non servono...se cosi è poco chiaro ti metto anche il resto.

Codice:
/******************************************************************************** 
 * Levenberg-Marquardt minimization.
 ********************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>

#include "lm.h"

#define stringa "OUTPUT.DAT"
#define esp 2.718281828459

struct mydata{
   double t[100];
   double X[100];
   double XP[100];
   double XPP[100];
   double TETAG[100];
   double WIND[100];
   double d[100];
} data;


/******************************************************************************** 
 *                    Lettura dati da file "OUTPUT.DAT".
 ********************************************************************************/

int legge(int punti)
{
	FILE *fp;
	int i=0;
	
	if((fp=fopen(stringa,"r"))==NULL)
		printf("Impossibile aprire il file");
	else
	{
		printf("Dati letti:\n");
		while(fscanf(fp,"%LE %LE %LE %LE %LE %LE %LE",&data.t[i],&data.X[i],&data.XP[i],&data.XPP[i],&data.TETAG[i],&data.WIND[i],&data.d[i])>0)
		{
			printf(".");
			i++;
			if(i>100)
			{
				printf("\n");
				break;
			}
		}
		for(i=0;i<100;i++)
			printf("%.4g\t",data.t[i]);
		printf("\n");
	}

	fclose(fp);

	return i;
}

/******************************************************************************** 
 *                    Funzione dell'errore quadratico.
 ********************************************************************************/

void errore(double *p, double *x, int m, int n, void *data)
{
	struct mydata *dptr;
	dptr=(struct mydata *)adata;

	/*Definizione delle coppie ingresso-uscita*/
	for(t=0; t<40; t++)
	{
		u[0][t] = dptr->X[t];
		u[1][t] = dptr->XP[t];
		u[2][t] = dptr->XPP[t];
		u[3][t] = dptr->TETAG[t];
		u[4][t] = dptr->WIND[t];
	}
	printf("\nAssegnazione vaolri u \n");

	for(t=0; t<40; t++)
	{
		d[0][t] = dptr->X[t];
		d[1][t] = dptr->XP[t];
		d[2][t] = dptr->XPP[t];
	}
	
}

/******************************************************************************** 
 *                                 M A I N.
 ********************************************************************************/

int main()
{

	legge(punti);

	ret=dlevmar_dif(errore, p, x, m, n, 1000, opts, info, NULL, NULL, (void *)&data);

}
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 11:06   #13
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
Ovviamente lì ci deve essere data e non adata
La chiamata dovrebbe essere corretta.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 11:07   #14
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
Ovviamente lì ci deve essere data e non adata
La chiamata dovrebbe essere corretta.
quindi è un errore delle FAQ?
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 11:19   #15
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 salvodel Guarda i messaggi
quindi è un errore delle FAQ?
Probabilmente nell'implementazione avevano dato il nome adata e non data all'ultimo parametro...dopo tutto il nome lo puoi cambiare a piacimento
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 12:52   #16
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
Probabilmente nell'implementazione avevano dato il nome adata e non data all'ultimo parametro...dopo tutto il nome lo puoi cambiare a piacimento
Ciao cionci stavo rileggendo le FAQ e mi è venuto un dubbio: li dice che se utilizzo la struttura non devo definirla globale. Giusto?
Visto che ci siamo ti chiedo un'altra cosa: ho 7 vettori ma non voglio passarli come
Codice:
struct mydata {
    double vet1;
    double vet2;
    ......
    double vet7;
} data;
poiche non posso o meglio non so come utilizzarli in un ciclo for. Non so se sono stato chiaro. Ti faccio vedere che cosa ha partorito la mia mente
Codice:
struct mydata {
    double mat[7][100];
} data;

for(i=0;i<7;i++)
    for(j=0;j<100;j++)
      data.mat[i][j]
Ci sono soluzioni piu ovvie oppure semplicemente nelle FAQ utilizza le strutture ma potrei utilizzare nel mio caso direttamente l'array?
Grazie
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 14:51   #17
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
Puoi mettere anche una matrice così come l'hai definita te...in pratica in quella struttura ci puoi mettere quello che ti pare
La struttura la devi definire globale...l'istanza della struttura (cioè "data") la devi dichiarare locale. Infatti dice che definire quella struttura è un modo per evitare variabili globali.

Ultima modifica di cionci : 04-01-2008 alle 14:54.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 16:02   #18
salvodel
Senior Member
 
L'Avatar di salvodel
 
Iscritto dal: Dec 2004
Messaggi: 783
Quote:
Originariamente inviato da cionci Guarda i messaggi
Puoi mettere anche una matrice così come l'hai definita te...in pratica in quella struttura ci puoi mettere quello che ti pare
La struttura la devi definire globale...l'istanza della struttura (cioè "data") la devi dichiarare locale. Infatti dice che definire quella struttura è un modo per evitare variabili globali.
Ho detto un'altra c.....
Cmq oggi, finalmente, sono riuscito ad utilizzare questo programmino ed il merito è tuo. Ti ringrazio per la pazienza ed i tanti consigli che mi hai dato.
Visto che siamo in fase di ringraziamento anche se quasi certamente non apriranno mai questo post voglio ringraziare

variabilepippo
wingman87
amedeoviscido
Ziosilvio
gepeppe
71104
andbin
yorkeiser

Un ultimo speciale ringraziamento lo devo fare a mad_hhatter che mi ha spesso aiutato su alcuni dubbi "matematici".
Di nuovo grazie a tutti anche a chi non compare nella lista per una mia mancanza.
__________________
"May the wind always be at your back and the sun upon your face.
And may the wings of destiny carry you aloft to dance with the stars...."

Ultima modifica di salvodel : 04-01-2008 alle 16:05.
salvodel è offline   Rispondi citando il messaggio o parte di esso
Old 04-01-2008, 16:04   #19
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
Bene Di niente
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione HUAWEI Mate X7: un foldable ottimo, ma restano i soliti problemi Recensione HUAWEI Mate X7: un foldable ottimo, m...
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...
Amazon sconta schede video, CPU e access...
Halo: Campaign Evolved, l'uscita del rem...
La rete elettrica europea sta limitando ...
Apple Magic Keyboard per iPad Pro 11'' i...
BYD punta a nuove tecnologie: batterie a...
Windows 11 porta il Bluetooth multi-disp...
iPhone 17e e non solo: Gurman svela le c...
Arrestato per omicidio, in lacrime ai po...
Vexilar, scopa elettrica da 65000Pa, 4,9...
Linux 7.0 sarà la prossima versio...
Windows 11: Copilot AI entra anche nella...
Apple apre CarPlay ai chatbot di terze p...
Horses: Santa Ragione afferma di essere ...
Nuova causa contro Tesla e maniglie elet...
MindsEye, il CEO accusa: 'Speso un milio...
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: 12:48.


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