Torna indietro   Hardware Upgrade Forum > Software > Programmazione

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 frequenze al top per il gaming
AMD Ryzen 7 9850X3D è la nuova CPU gaming di riferimento grazie alla 3D V-Cache di seconda generazione e frequenze fino a 5,6 GHz. Nei test offre prestazioni superiori a 9800X3D e 7800X3D, confermando la leadership AMD nel gaming su PC.
Le soluzioni FSP per il 2026: potenza e IA al centro
Le soluzioni FSP per il 2026: potenza e IA al centro
In occasione del Tech Tour 2025 della European Hardware Association abbiamo incontrato a Taiwan FSP, azienda impegnata nella produzione di alimentatori, chassis e soluzioni di raffreddamento tanto per clienti OEM come a proprio marchio. Potenze sempre più elevate negli alimentatori per far fronte alle necessità delle elaborazioni di intelligenza artificiale.
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa
AWS è il principale operatore di servizi cloud al mondo e da tempo parla delle misure che mette in atto per garantire una maggiore sovranità alle organizzazioni europee. L'azienda ha ora lanciato AWS European Sovereign Cloud, una soluzione specificamente progettata per essere separata e distinta dal cloud "normale" e offrire maggiori tutele e garanzie di sovranità
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


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...
Le soluzioni FSP per il 2026: potenza e IA al centro Le soluzioni FSP per il 2026: potenza e IA al ce...
AWS annuncia European Sovereign Cloud, il cloud sovrano per convincere l'Europa AWS annuncia European Sovereign Cloud, il cloud ...
Redmi Note 15 Pro+ 5G: autonomia monstre e display luminoso, ma il prezzo è alto Redmi Note 15 Pro+ 5G: autonomia monstre e displ...
HONOR Magic 8 Pro: ecco il primo TOP del 2026! La recensione HONOR Magic 8 Pro: ecco il primo TOP del 2026! L...
Case PC in offerta: flusso d'aria ottimi...
Kingdom Come: Deliverance, dopo il succe...
Xiaomi domina tra le auto importate dall...
Upgrade PC a prezzo ridotto: Amazon scon...
SOCAMM: sarà questa l'implementaz...
Milano-Cortina 2026 nel mirino degli hac...
Vivaldi alza il dito medio (di nuovo) al...
PS Plus: Sony annuncia i nuovi giochi di...
Prezzi da urlo su Amazon Haul: parte la ...
Snapchat si riorganizza: nasce una divis...
Doppia offerta OLED LG: G5 55'' con staf...
Spotify straccia tutti i record: nel 202...
Henry Cavill svela il nuovo reboot di Hi...
Galaxy S25 512GB: il top compatto Samsun...
La fine di un'era: Tesla dice basta a Mo...
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:12.


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