Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere?
HONOR Magic V6 è arrivato in Italia a 2.299,90 euro con una promessa precisa: unire 4 mm di spessore da aperto (8,75 mm chiuso nel modello White, 9 mm negli altri colori) a una batteria da 6.660 mAh, la più capiente mai vista su un pieghevole. Lo abbiamo usato per oltre una settimana in versione Red 16/512 GB per capire se lo Snapdragon 8 Elite Gen 5 tiene testa alla concorrenza anche fuori dai benchmark ufficiali
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni
Redmi Pad 2 9.7 punta su un display ampio e fluido, una batteria capace di accompagnare l'uso quotidiano senza ansie da ricarica e un prezzo accessibile, a partire da 179,90 euro per la versione con 64 GB di storage. Lo Snapdragon 6s 4G Gen 2 e i 4 GB di RAM della configurazione più diffusa frenano però chi cerca reattività e multitasking spinto: ecco il bilancio dopo due settimane di prova diretta
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Peugeot Polygon Concept: ecco il futuro delle utilitarie
Polygon è la concept car di Peugeot che mostra il futuro delle soluzioni del segmento B: tra design compatti e innovativi affiancati da dimensioni compatte uno scherzo dalla manovrabilità incredibile per le manovre a bassa velocità
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-09-2010, 10: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, 12: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, 13: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, 13: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 13:59.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 14: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 14:21.
frank10 è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 14: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 14:29.
tuccio` è offline   Rispondi citando il messaggio o parte di esso
Old 16-09-2010, 22: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, 00: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


Recensione HONOR Magic V6: spessore record e super batteria. È lui il fold da battere? Recensione HONOR Magic V6: spessore record e sup...
Redmi Pad 2 9.7: ampio display, economico e peso contenuto, ma qualche limite nelle prestazioni Redmi Pad 2 9.7: ampio display, economico e peso...
Peugeot Polygon Concept: ecco il futuro delle utilitarie Peugeot Polygon Concept: ecco il futuro delle ut...
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...
SK Hynix debutta a Wall Street con una r...
QuTech annuncia Tuna-17, un processore q...
Chat Control: il Parlamento europeo viet...
vivo Watch GT 2: stile, salute e autonom...
Il fix di Microsoft Defender è pe...
SentinelOne integra Prompt Security con ...
Ha fotografato Giove con una Game Boy Ca...
Sony RX10 V: tornano le fotocamere bridg...
OpenAI lancia ChatGPT Lavoro: l'agente c...
GPT-5.6 Sol 'asfalta' Claude Fable 5: Op...
Netflix ha ucciso la TV coi canali, ora ...
Kyndryl estende i servizi per il cloud s...
Addio allo scalino delle fotocamere? Una...
"Il mio piccolo sporco segreto"...
Instagram e Facebook sotto accusa: secon...
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:46.


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