Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[C] Variabili globali o variabili puntatore?

Linguaggi e sistemi

Moderatori: Foto UtentePaolino, Foto Utentefairyvilje

1
voti

[1] [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteMax2433BO » 30 mag 2015, 16:41

Buon giorno a tutti,

da autodidatta sto cercando di studiare, nel poco tempo libero, le basi della programmazione in linguaggio C.

Ai più ferrati del sottoscritto, avrei da porre una domanda:

vorrei sapere che differenza sussiste nell'utilizzare delle variabili globali (ossia variabili dichiarate all'esterno di "main") o delle variabili puntatore, per permettere a delle funzioni di modificare variabili esterne alla funzione stessa.

Ad esempio questi due semplicissimi programmi (il primo utilizza variabili globali e il secondo variabili puntatore) separano la parte intera da quella frazionaria in un numero con virgola.

Codice: Seleziona tutto
# include <stdio.h>

/* definizione variabili esterne */

int intero;
float frazionario;

/* definizione prototipo di funzione */

void separazione_intero_e_frazionario (float numero);

int main (void)
{
   /* definizioni variabili interne */
   
   float numero_decimale;
   numero_decimale = 0;
   
   /* input numero da analizzare */
   
   printf ("Inserici un numero decimale (usare il \".\" come separatore decimale)\n");
   scanf ("%f", &numero_decimale);
   
   /* chiamata funzione di analisi */
   
   separazione_intero_e_frazionario (numero_decimale);
   
   /* stampa analisi */
   
   printf ("Il numero %f si suddivide in\n", numero_decimale);
   printf ("%d = parte intera\n", intero);
   printf ("%f = parte frazionaria\n", frazionario);
      
   return 0;
   
}

/* funzione di separazione tra intero e frazionario */
/* manipola variabili esterne */

void separazione_intero_e_frazionario (float numero)
{
   /* calcolo intero e frazionario di un numero */
   
   intero = (int) numero;
   frazionario = numero - (int) numero;
   
}


Codice: Seleziona tutto
# include <stdio.h>

/* definizione prototipo di funzione */
/* le variabili *p... sono i puntatori alle rispettive variabili con il medesimo nome */

void separazione_intero_e_frazionario (float numero, int *pintero, float *pfrazionario);

int main (void)
{
   /* definizioni variabili interne */
   
   int intero;
   float numero_decimale, frazionario;
   intero = 0;
   numero_decimale = 0;
   frazionario = 0;
   
   /* input numero da analizzare */
   
   printf ("Inserici un numero decimale (usare il \".\" come separatore decimale)\n");
   scanf ("%f", &numero_decimale);
   
   /* chiamata funzione di analisi */
   
   separazione_intero_e_frazionario (numero_decimale, &intero, &frazionario);
   
   /* stampa analisi */
   
   printf ("Il numero %f si suddivide in\n", numero_decimale);
   printf ("%d = parte intera\n", intero);
   printf ("%f = parte frazionaria\n", frazionario);
      
   return 0;
   
}

/* funzione di separazione tra intero e frazionario */
/* manipola variabili interne tramite puntatore */

void separazione_intero_e_frazionario (float numero, int *pintero, float *pfrazionario)
{
   /* calcolo intero e frazionario di un numero */
   
   *pintero = (int) numero;
   *pfrazionario = numero - (int) numero;
   
}


Entrambi danno il medesimo risultato per cui non riesco a comprendere, in questo caso di utilizzo, la differenza tra usare una variabile globale e un puntatore.

O_/ Max
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

La gentilezza dovrebbe diventare lo stile naturale della vita, non l'eccezione [Siddhārtha Gautama]
Avatar utente
Foto UtenteMax2433BO
18,6k 4 11 13
G.Master EY
G.Master EY
 
Messaggi: 4724
Iscritto il: 25 set 2013, 16:29
Località: Universo - Via Lattea - Sistema Solare - Terzo pianeta...

3
voti

[2] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto Utentesimo85 » 30 mag 2015, 16:53

Max2433BO ha scritto:la differenza tra usare una variabile globale e un puntatore.

L'uso della variabile globale rende il programma più veloce rispetto al passaggio per riferimento con puntatore.
Prova a fare un disassembling della funzione main e separazione_intero_e_frazionario e compara.

Nella pratica non è sempre buona idea usare variabili globali. I.e. vedi qui: http://c2.com/cgi/wiki?GlobalVariablesAreBad
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

0
voti

[3] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteMax2433BO » 30 mag 2015, 16:57

simo85 ha scritto: Prova a fare un disassembling della funzione main e separazione_intero_e_frazionario e compara.


... cosa dovrei fare?!?! ?%

simo85 ha scritto: Nella pratica non è sempre buona idea usare variabili globali...


Anche il mio libro dice che non è molto "sicuro" come metodo...

O_/ Max
Disapprovo quello che dite, ma difenderò fino alla morte il vostro diritto di dirlo [attribuita a Voltaire]

La gentilezza dovrebbe diventare lo stile naturale della vita, non l'eccezione [Siddhārtha Gautama]
Avatar utente
Foto UtenteMax2433BO
18,6k 4 11 13
G.Master EY
G.Master EY
 
Messaggi: 4724
Iscritto il: 25 set 2013, 16:29
Località: Universo - Via Lattea - Sistema Solare - Terzo pianeta...

2
voti

[4] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto Utentesimo85 » 30 mag 2015, 17:05

Max2433BO ha scritto:... cosa dovrei fare?!?! ?%

Fare il disassembling della funzione. In altre parole ottieni il codice Assembly a partire dal codice C.

Non so quale compilatore e debugger usi e su quale sistema operativo lavori, ma con gcc si può ottenere il codice Assembly con il flag di opzione -S

Codice: Seleziona tutto
gcc -S code.c


Altrimenti con gdb, all'interno della console dello stesso debugger, o con un analizzatore di file oggetto (i.e. objdump):

Codice: Seleziona tutto
disass <function>


Per l'architettura x86 con gdb è anche possibile scegliere la sintassi di output, intel o AT&T.

Pagina di wikipedia sul disassembling: http://en.wikipedia.org/wiki/Disassembler
Avatar utente
Foto Utentesimo85
30,9k 7 12 13
Disattivato su sua richiesta
 
Messaggi: 9927
Iscritto il: 30 ago 2010, 4:59

1
voti

[5] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto Utentealdofad » 30 mag 2015, 17:24

Le variabili vanno sempre dichiarate nel contesto più restrittivo possibile. Parlare di perdita di performance in tal senso è assurdo, primo perché i compilatori hanno l'optimizer e secondo perché il codice è più gestibile e conta solo questo.
Avatar utente
Foto Utentealdofad
853 4 5
Sostenitore
Sostenitore
 
Messaggi: 689
Iscritto il: 21 gen 2014, 1:07
Località: Treviso

-3
voti

[6] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteEcoTan » 30 mag 2015, 18:00

Sono uno che usa il C per necessità (cioè per giocare coi robottini) infognandomi il meno possibile.
In pratica dico che bisogna ben guardarsi dal dichiarare delle variabili dentro il main o dentro una routine ISR o dentro una funzione.
Le variabili vanno dichiarate prima di tutto ciò, cioè devono stare nell'area global.
Altrimenti i diversi pezzi dell'applicazione sarebbero liberi di sovrascrivere i valori delle variabili all'insaputa l'uno dell'altro, con risultati ovviamente folli, alla ricerca di risparmiare qualche byte di memoria dati.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5424
Iscritto il: 29 gen 2014, 8:54

0
voti

[7] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto Utentealdofad » 30 mag 2015, 18:05

Forse volevi dire il contrario dato che è proprio dichiarando le variabili globali che è possibile accedervi da più contesti.
Avatar utente
Foto Utentealdofad
853 4 5
Sostenitore
Sostenitore
 
Messaggi: 689
Iscritto il: 21 gen 2014, 1:07
Località: Treviso

0
voti

[8] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteEcoTan » 30 mag 2015, 18:09

Sì, è possibile accedervi da più contesti ma in modo logico, cioè chi aggiorna il valore di una variabile lo fa a beneficio di tutti gli altri, posto che ogni variabile, individuata tramite il proprio nome, rappresenti qualcosa di reale . In sostanza è possibile passare dei valori dal main alle routine e viceversa.
(altrimenti ogni operazione su una variabile deve essere condotta dall'inizio alla fine senza la possibilità che venga interrotta)
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5424
Iscritto il: 29 gen 2014, 8:54

3
voti

[9] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteTardoFreak » 30 mag 2015, 18:48

Foto UtenteEcoTan avrei molte cose da dire su quello che hai scritto ...

Mah!
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,9k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15754
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

0
voti

[10] Re: [C] Variabili globali o variabili puntatore?

Messaggioda Foto UtenteEcoTan » 30 mag 2015, 18:57

Ti assicuro che i miei robottini fanno esattamente quello che dico io (dopo un po' di prove)
Faccio copia-incolla da un mio maestro:
La dichiarazione static di una variabile locale serve per velocizzare l'esecuzione a discapito di un maggiore uso della ram.
Personalmente preferisco dichiarare delle variabili global invece delle locali static, in pratica mi creo tot variabili TMP_x che uso all'interno delle funzioni senza dover creare variabili locali, tecnica che impegna ram, ma che velocizza sensibilmente l'esecuzione dei programmi in presenza di molte funzioni che dovrebbero usare variabili locali.
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5424
Iscritto il: 29 gen 2014, 8:54

Prossimo

Torna a PC e informatica

Chi c’è in linea

Visitano il forum: Nessuno e 76 ospiti