Torna indietro   Hardware Upgrade Forum > Software > Programmazione

MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi
Abbiamo provato MSI PRO MAX EDGE AI+, un mini-PC professionale progettato per eseguire modelli di intelligenza artificiale in locale, senza dipendere dal cloud. Il sistema abbina il processore AMD Ryzen AI Max+ 395, 128 GB di memoria unificata e un telaio in alluminio da appena 4 litri, con l'obiettivo di offrire capacità di elaborazione elevate in un formato compatto.
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista
Il nuovo top di gamma vivo punta su un comparto fotografico particolarmente articolato, con un teleobiettivo da 200 megapixel e teleconvertitori esterni capaci di arrivare a 400 mm equivalenti. Lo abbiamo provato a Tenerife, mettendo alla prova fotocamere, prestazioni, autonomia e accessori. Ecco come si è comportato.
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà
Un mondo affollato e vivo, personaggi destinati a sparire a fine test e nessuno a inseguire l'oggetto giusto. Beta e stress test di World of Warcraft: Forever hanno fatto emergere un roleplay spontaneo, tra danze a Goldshire e code ordinate ai PNG
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-09-2010, 11:44   #1
frank10
Senior Member
 
Iscritto dal: Feb 2005
Messaggi: 579
[C] variabile modificata da funzione

Sono nuovo del C, forse questa è una banalità, portate pazienza.

Ho una variabile globale che cambia all'interno di una funzione.

Da un'altra funzione, voglio leggere quel valore, ma me ne dà un altro:

ad esempio, semplificando:

Codice:
#include <stdio.h>   
#include <time.h>
#include <sys/timeb.h>
#include <windows.h>

void CalcolaConsumi( float );
void LeggiCounter();

float TimeAnow=0;
struct timeb tempo;


int main(short argc, char **argv)
{
			int goLoop = 1;
			int timer = atoi(argv[1]);
			while (goLoop)	
			{	
				
					LeggiCounter();	
					CalcolaConsumi( TimeAnow);
									
				Sleep( timer );
			}
			

}

void LeggiCounter()	
{
			ftime(&tempo);
			TimeAnow = (float)tempo.time*1000+tempo.millitm;

			printf("%.0f\n", TimeAnow);
}


void CalcolaConsumi(float prova)
{

printf("%.0f\n", prova);
}
mi dà TimeAnow=
1284629672649 (che è corretto)
1284629725184 (da CalcolaConsumi mi dà sempre questo valore fisso)

Come mai, non è una variabile globale?
frank10 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 13:42   #2
frank10
Senior Member
 
Iscritto dal: Feb 2005
Messaggi: 579
Ho scoperto che mettendo un altro printf all'interno della prima funzione LeggiCounter, dove cambia il valore della variabile, mi dà anche lì il risultato sbagliato.


Codice:
void LeggiCounter()	
{
			ftime(&tempo);
			TimeAnow = (float)tempo.time*1000+tempo.millitm;
		
printf("%.0f\n", TimeAnow);   // CORRETTO

printf("%.0f\n", TimeAnow);  // SBAGLIATO
}
Allora non c'entra il passaggio ad un'altra funzione, ma la funzione printf che mi modifica la variabile.

Come mai printf mi modifica la variabile appena creata?
frank10 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 14:30   #3
frank10
Senior Member
 
Iscritto dal: Feb 2005
Messaggi: 579
Altra scoperta:

Aggiungendo uno Sleep(100); dopo la modifica della variabile, essa rimarrà sempre a un valore fisso anche alle successive chiamate! Non sarà più corretta!

Codice:
void LeggiCounter()	
{
			ftime(&tempo);
			TimeAnow = (float)tempo.time*1000+tempo.millitm;
			
                                Sleep(100);
				printf("%.0f\n", TimeAnow);
				printf("%.0f\n", TimeAnow);
				
}
A questo punto, non è neppure printf...
Ma cosa??
frank10 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 14:56   #4
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
visto che non ha molto senso l'errore, probabilmente è un overflow, d'altronde non capisco perché usare il tipo float per valori interi positivi, per me con unsigned int funzionerà tutto :E

ps: che bruttezza tutte quelle variabili globali

Ultima modifica di tuccio` : 16-09-2010 alle 14:59.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 15:19   #5
frank10
Senior Member
 
Iscritto dal: Feb 2005
Messaggi: 579
Avevo usato float perché, essendo in ms, poi dividevo per 1000 per avere i secondi e devo sottrarre un altro valore per vedere la differenza e lì mi serve la virgola per avere un po' di corretta approssimazione.

Comunque sì, ho provato a mettere int e funziona.

Con int e i secondi non riuscirei ad avere abbastanza precisione.
Allora ho lasciato la lettura del tempo in ms in int e poi successivamente ho convertito in float per avere i secondi con la virgola.

Ottimo, grazie.


Bè, nell'esempio, ne ho messa solo una... dato che timeb è dentro un include.
Tu come faresti avendo parecchie variabili da aggiornare?
Passarle tutte tra funzioni con i return?

Ultima modifica di frank10 : 16-09-2010 alle 15:21.
frank10 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 15:26   #6
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
o passaggio per riferimento..

comunque TimeAnow e tempo sono due variabili globali, che intendi per "è dentro un include"?

in generale, comunque, evitare le variabili globali è una regola di buona programmazione

ps: comunque se ritieni corretta la scelta di usare una variabile in virgola mobile, c'è sempre il tipo double

Ultima modifica di tuccio` : 16-09-2010 alle 15:29.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 23:32   #7
frank10
Senior Member
 
Iscritto dal: Feb 2005
Messaggi: 579
Ho provato con double e funziona bene.
Quindi è solo il float a dare quei problemi. Strano.


Ho letto un po' sui puntatori (non li avevo fatti prima).

Quindi, togliendo le var globali, passare per riferimento, sarebbe ad esempio:

Codice:
void LeggiCounter(double *pTime);
void CalcolaConsumi(double *prova);

int main(short argc, char **argv)
{
	double TimeAnow=0;
	int goLoop = 1;
	int timer = atoi(argv[1]);
	while (goLoop)	
	{			
		LeggiCounter(&TimeAnow );	
		printf("%f___\n", TimeAnow);
		CalcolaConsumi( &TimeAnow );
				
		Sleep( timer );
	}

}


void LeggiCounter(double *pTime)	
{
	struct timeb tempo;

	ftime(&tempo);
	*pTime = (double)tempo.time*1000+tempo.millitm;
	printf("%f\n", *pTime);
				
}

void CalcolaConsumi(double *prova)
{
printf("%f\n",*prova);
}
frank10 è offline   Rispondi citando il messaggio o parte di esso
Old 17-09-2010, 01:09   #8
tuccio`
Senior Member
 
Iscritto dal: Apr 2010
Città: Frosinone
Messaggi: 416
il passaggio per riferimento è bene farlo dove è richiesta la modifica... la funzione

Codice:
void CalcolaConsumi(double *prova)
{
printf("%f\n",*prova);
}
non modifica il valore della variabile, e questo dovrebbe trasparire dall'intestazione della funzione.. un'intestazione del tipo

Codice:
void CalcolaConsumi(double prova);
oppure


Codice:
void CalcolaConsumi(const double *prova);
"dice" che la variabile non verrà modificata (perché non puoi farlo nella funzione)

in questo caso il passaggio per valore è la cosa migliore
tuccio` è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB per far girare in locale anche i modelli più grandi MSI PRO MAX EDGE AI+, Ryzen AI Max+ 395 e 128 GB...
Recensione vivo X500 Pro Max: la fotografia mobile ha un nuovo protagonista Recensione vivo X500 Pro Max: la fotografia mobi...
WoW Forever: la beta è stato uno dei momenti più alti della storia dei videogiochi, e non si ripeterà WoW Forever: la beta è stato uno dei mome...
Oracle AI World 2026: in Europa prima la sovranità, poi la sicurezza e solo dopo l'IA Oracle AI World 2026: in Europa prima la sovrani...
DS N°7 E-Tense: il SUV premium made in Melfi che punta su autonomia e comfort DS N°7 E-Tense: il SUV premium made in Melfi...
Il razzo spaziale NASA SLS per la missio...
Il drone NASA Dragonfly ha volato per la...
GTA 6, preload dal 10 novembre: servono ...
The Elder Scrolls VI: Sentinel, Bethesda...
Un doppio disco di detriti attorno a una...
Windows 11: risolta la disattivazione fo...
42AI, l'intelligenza artificiale anticip...
Windows 11 26H2 gira con appena 128 MB d...
GPT-6.2 Astra compare in Codex, Claude F...
Record assoluto per Linux 7.4: quasi mez...
Datacenter “standard” esonerato dalla va...
Occhio ai consumi: nuovi limiti condivis...
Ericsson ISAC System, la tecnologia per ...
Comprano processori solo per gettarli: l...
Canva lancia Affinity per iPad: sketch, ...
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: 23:52.


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