Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
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


Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Dreamforce 2026: Salesforce punta sulla ...
SpaceX ha confermato che Flight 14 sar&a...
Googlebook pronto al debutto: Google apr...
Guida all'acquisto: quale lavapavimenti ...
Google Maps su Android Auto introduce fi...
AMD Ryzen 5 5500F: fino al 16% di presta...
L'ecosistema partner di Microsoft cresce...
Oracle registra un boom nella divisione ...
Amazon Prime Video sfida TikTok con le n...
L'uscita di Rayman Legends Retold &egrav...
Dazio UE sui pacchi extra UE, in Italia ...
La nuova lavatrice smart di Xiaomi ha tr...
Hai una PSP nel cassetto? Questo nuovo p...
Oracle presenta Java 27 con diverse novi...
Il microscopio dell'EPFL vede più...
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: 04:37.


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