Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - aiuto su procedure...importantissimo!!!
Forum - C/C++ - aiuto su procedure...importantissimo!!!

Avatar
francescosup (Normal User)
Newbie


Messaggi: 7
Iscritto: 08/11/2009

Segnala al moderatore
Postato alle 18:06
Lunedì, 11/01/2010
ragazzi se riuscite ad aiutarmi ve ne sarò grati davvero tanto!!

Sto studiando il C e sono arrivato ai sottoprogrammi (funzioni e procedure).
Per le funzioni nessun problema.
Per quanto riguarda le procedure, ho delle titubanze!!!

Praticamente ho capito che, a differenza delle funzioni, le procedure non restituiscono un valore, ma modificano lo stato del programma principale, cioè lo stato di una variabile del programma principale, da cui vengono chiamate.
Tuttavia se la procedura è applicata su variabili locali (e non globali), bisogna riferirsi a queste variabili usando gli indirizzi delle celle,quindi puntatori ecc. , ma perchèèèè???
Cioè perchè se lavoro su variabili globali, posso non usare i puntatori, mentre con le variabili locali si???
So che è una stupidata ma mi serve capire bene il concetto,quindi siate più chiari possibile grazie mille!!!!

Ultima modifica effettuata da francescosup il 11/01/2010 alle 18:07
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:15
Lunedì, 11/01/2010
Non so come l'hai capita o come te l'hanno spiegata, ma la faccenda è semplice.

Una "procedura", se vuole modificare un valore passato dall'esterno, lo puo' fare solo se questo valore è passato tramite puntatore. Oppure, se questo valore e' in una variabile globale.


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 18:22
Lunedì, 11/01/2010
:-|
Ma da dove stai studiando?
Comunque le variabili globali dovrebbero essere usate con parsimonia anzi, sono sconsigliate l'uso di queste variabili anche per pratica di buona programmazione, poiché rischiano di generare interazioni di difficile controllo tra diverse parti di un programma e può portare ad una scarsa leggibilità semantica del codice.

Per la procedura o funzione, puoi passare in due modi: per riferimento o per valore.
Per valore che passi i parametri alla funzione che successivamente possono essere modificate all'interno della funzione, ma una volta terminata al funzione.. le variabili passati come parametri non vengono modificati. Cosa contraria invece è per riferimento, mediante l'uso di puntatori, appunto per modificare le variabili stesse.
Esempio facile:
Codice sorgente - presumibilmente C++

  1. void scambia( int *p, int *q )
  2. {
  3.   int temp;
  4.  
  5.   temp = *p;
  6.   *p = *q;
  7.   *q = temp;
  8. }


Senza così dove usare le variabili globali.

EDIT: amazing, anticipato, vabbè xD
Meglio che studi dal libro che li è tutto spiegato bene ;)

Ultima modifica effettuata da Lawliet il 11/01/2010 alle 18:39


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
francescosup (Normal User)
Newbie


Messaggi: 7
Iscritto: 08/11/2009

Segnala al moderatore
Postato alle 18:32
Lunedì, 11/01/2010
Lawliet grazie della risposta chiara!
Quindi quando uso le procedure e passo i parametri per valore, la variabile viene modificata solo nell'ambiente locale della procedura e non anche nel programma principale dove richiamo la procedura.

Mentre se passo le variabili per indirizzo (o riferimento come hai detto tu), il valore della variabile viene modificato anche nel programma principale, poiche viene modificato nella cella in cui è contenuta la variabile, è esatto??

PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 20:58
Lunedì, 11/01/2010
Esatto.
Puoi vederla cosi', se passi una variabile per valore viene creata una nuova variabile nell'ambito della funzione chiamata, pertanto una modifica in essa non influenza la variabile originale.
Se invece passi una variabile per indirizzo la funzione lavorera' direttamente sulla variabile originale, le viene solamente detto dove puo' trovarla.


"I have never let my schooling interfere with my education." Mark Twain
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:03
Martedì, 12/01/2010
Mi permetto di rispondere alla prima domanda che hai fatto: perchè?

Il perchè dell'uso dei puntatori per la modifica di variabili locali mi sembra abbastanza ovvio. Poiché il sottoprogramma non può accedere a tale variabile direttamente, dato che essa risiede in un altro blocco di codice a cui non ha accesso, l'unico modo per modificarla è comunicarle direttamente l'indirizzo di memoria.

Detto questo, non è che non si possano usare puntatori per le variabili globali. Semplicemente non ha senso farlo, dacchè esse sono direttamente raggiungibili da tutti i sottoprogrammi.


"Infelici sono quelli che hanno tanto cervello da vedere la loro stupidità."
(Fligende Blatter)

"Dubitare di se stessi è il primo segno d'intelligenza."
(Ugo Ojetti)
PM Quote
Avatar
Zonzo (Ex-Member)
Rookie


Messaggi: 34
Iscritto: 21/04/2008

Segnala al moderatore
Postato alle 16:27
Martedì, 12/01/2010
Una variabile è l'astrazione di una zona di memoria.
Quando noi dichiariamo una variabile in base al tipo viene occupata una zona di memoria di un tot di Byte.
I parametri che sono le variabili che noi passiamo al sottoprogramma, possono essere passati per indirizzo o per valore.
Se viene passata per valore, una variabile viene duplicata in un'altra zona di memoria.
Se ad esempio dichiariamo la variabile "char carattere"  viene occupato uno spazio disponibile in memoria, che in questo caso è di 1 Byte (ad esempio all'indirizzo 0x003F).
Se passiamo questa variabile al sottoprogramma per valore viene occupata un'altra zona di memoria da un Byte(ad esempio all'indirizzo 0x0043) in cui si copierà il valore della variabile "carattere".

SITUAZIONE MEMORIA

0x0038   a
0x003F   c  <-  Variabile relativa al programma chiamante
0x0041   1
0x0042   3
0x0043   c  <-  Variabile relativa al programma chiamato
0x0044   f

Il sottoprogramma lavorerà solamente sulla zona 0x0043 e quindi anche se il valore venisse modificato durante l'esecuzione, al termine del sottoprogramma la zona di memoria dove risiede il valore della variabile duplicata "carattere" relativa solo al programma chiamato(0x0043) viene liberata e quindi il valore viene "perso" ed è come se la variabile del programma chiamante non fosse stata modificata (come in effetti lo è) ed avrà lo stesso valore di quando ha chiamato il sottoprogramma. Se invece al sottoprogramma viene passata una variabile per indirizzo, verrà preso come riferimento la stessa zona di memoria in cui risiede la variabile del programma chiamante.

SITUAZIONE MEMORIA

0x0038   a
0x003F   c  <-Variabile relativa al programma chiamante e al programma chiamato
0x0041   1
0x0042   3
0x0043   9  
0x0044   f

Quindi se il valore all'interno del sottoprogramma dovesse essere modificato, la modifica si ripercuoterà anche sulla variabile del programma chiamante.
Ecco la differenza tra passaggio per indirizzo e per valore.
Ricapitolando:
Passiamo una variabile per valore solo se vogliamo che il sottoprogramma chiamato non modifichi il contenuto della variabile del programma chiamante ma vogliamo che utilizzi solo il suo valore.
Passiamo una variabile per indirizzo solo se volgiamo che il sottoprogramma chiamato  modifichi intenzionalmente il valore della variabile del sottoprogramma chiamante.

Una variabile globale è riconosciuta da tutti i sottoprogrammi.
Una variabile locale è riconosciuta solo dal sottoprogramma in cui è dichiarata.

P.S.: Voglio precisare che in C esiste solo la definizione di funzione, perché la procedura è vista come caso particolare, perché restituisce comunque un valore che però è nullo (ovvero il void).

Ultima modifica effettuata da Zonzo il 12/01/2010 alle 23:15


Un linguaggio che non influenza il modo di pensare la programmazione, non vale la pena conoscerlo.
PM Quote