Pagina 1 di 5

[C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 16:41
da Max2433BO
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

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 16:53
da simo85
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

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 16:57
da Max2433BO
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

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 17:05
da simo85
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

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 17:24
da aldofad
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.

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 18:00
da EcoTan
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.

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 18:05
da aldofad
Forse volevi dire il contrario dato che è proprio dichiarando le variabili globali che è possibile accedervi da più contesti.

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 18:09
da EcoTan
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)

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 18:48
da TardoFreak
Foto UtenteEcoTan avrei molte cose da dire su quello che hai scritto ...

Mah!

Re: [C] Variabili globali o variabili puntatore?

MessaggioInviato: 30 mag 2015, 18:57
da EcoTan
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.