Incremento postfisso-variabile static

Gianni911
Ragazzi ho tre domande differenti,ma le posto insieme,per facilita di gestione..
La prima riguarda l'operatore di incremento postfisso.
Nel miio libro ho scitto:
pp.stack[++(pp.top)]-->>ERRORE INCREMENTO POSTFISSO

non riesco a capire perchè é un errore l'operatore postfisso prima incrementa e poi ritorna il valore incrementato..
Le altre riguardano il comando $ static $ .Quello che ho capito che sostanzialmente serve per limitare all'uso del file la variabile globale.
1Le variabili globali senza lo static possono essere utilizzate,negli altri file facenti parte dello stesso progetto?
2Che senso ha dichiarare static una variabile in una funzione??
Grazie :)

Risposte
hamming_burst
"Gianni91":
Ragazzi ho tre domande differenti,ma le posto insieme,per facilita di gestione..
La prima riguarda l'operatore di incremento postfisso.
Nel miio libro ho scitto:
pp.stack[++(pp.top)]-->>ERRORE INCREMENTO POSTFISSO

non riesco a capire perchè é un errore l'operatore postfisso prima incrementa e poi ritorna il valore incrementato..

che funzione è? Pop() mi sembra...

cmq vedila così:
pp.stack[++(pp.top)]
pp.top=pp.top+1
pp.stack[pp.top]


pp.stack[(pp.top)++]
pp.stack[pp.top]
pp.top=pp.top+1


cosa accade ai valori dello stack nei due casi? segue la definizione del metodo Pop() (o altro)?


Le altre riguardano il comando $ static $ .Quello che ho capito che sostanzialmente serve per limitare all'uso del file la variabile globale.
1Le variabili globali senza lo static possono essere utilizzate,negli altri file facenti parte dello stesso progetto?
2Che senso ha dichiarare static una variabile in una funzione??
Grazie :)

che linguaggio intendi? direi C o C++ (anche Java potrebbe).

Sii più completo nei post :-)

Gianni911
"hamming_burst":
.
cmq vedila così:
pp.stack[++(pp.top)]
pp.top=pp.top+1
pp.stack[pp.top]


pp.stack[(pp.top)++]
pp.stack[pp.top]
pp.top=pp.top+1


cosa accade ai valori dello stack nei due casi? segue la definizione del metodo Pop() (o altro)?

Si,riguarda la pila..
OK,era come sapevo,ma credevo che volesse inserirlo nel posizione incrementata,evidentemente prima vuole inserire e poi incrementare..
"hamming_burst":
.

Le altre riguardano il comando $ static $ .Quello che ho capito che sostanzialmente serve per limitare all'uso del file la variabile globale.
1Le variabili globali senza lo static possono essere utilizzate,negli altri file facenti parte dello stesso progetto?
2Che senso ha dichiarare static una variabile in una funzione??
Grazie :)

che linguaggio intendi? direi C o C++ (anche Java potrebbe).

Sii più completo nei post :-)

Effettivamente ho peccato di inprecisione!! :roll:
cmq il linguaggio é il c++

hamming_burst
"Gianni91":

ma credevo che volesse inserirlo nel posizione incrementata,evidentemente prima vuole inserire e poi incrementare..

Questo non va bene, devi esserne sicuro cambia tanto incrementare prima o dopo.
Dimmi quali sono i passi che compie il metodo Pop().

.
Le altre riguardano il comando $ static $ .Quello che ho capito che sostanzialmente serve per limitare all'uso del file la variabile globale.

a quanto ricordo esistono due diversificazioni a seconda dello scope dove viene utilizzato (che te hai già scritto).

1Le variabili globali senza lo static possono essere utilizzate,negli altri file facenti parte dello stesso progetto?

questo devi essere te ad autorizzarlo utilizzando l'operatore extern negli header.
Se utilizzi static la variabile globale rimane locale nel modulo, è per motivi di sicurezza non verrà vista all'estero (diciamo che è equivalente ad un private in Java). l'extern serve poi anche al linker per dire che esiste una cerca variabile con quel nome (ovvio deve essere unico nel progetto).

2Che senso ha dichiarare static una variabile in una funzione??

questa differenza la ho solo utilizzata forse ad un unico esercizio durante il primo corso di programmazione :-)
comunque serve per inizializzare una variabile mantenendo l'ultimo valore utilizzato durante le chiamate.

forse esistono altri utilizzi, io non me ne ricordo altri.

Gianni911
"hamming_burst":

questo devi essere te ad autorizzarlo utilizzando l'operatore extern negli header.
Se utilizzi static la variabile globale rimane locale nel modulo, è per motivi di sicurezza non verrà vista all'estero (diciamo che è equivalente ad un private in Java). l'extern serve poi anche al linker per dire che esiste una cerca variabile con quel nome (ovvio deve essere unico nel progetto).

Quindi se dichiaro una variabile globale static,posso usarla solo nel file dove la creo,se la dichiaro non static ma extern,posso usarla al di fuori,ma allora se la dichiaro non static che cambia dal dichiararla static se tanto posso usarla solo in quel file??? :|

"hamming_burst":


questa differenza la ho solo utilizzata forse ad un unico esercizio durante il primo corso di programmazione :-)
comunque serve per inizializzare una variabile mantenendo l'ultimo valore utilizzato durante le chiamate.

forse esistono altri utilizzi, io non me ne ricordo altri.

ma ha visibilita da quel punto in poi in tutto il file dove la creo ??
Scusa,potresti farmi un esempio pratico??Non ne capisco il senso.. :(

apatriarca
Una variabile static locale ad una funzione è una variabile locale a tale funzione (che è quindi visibile solo all'interno di quella funzione) la cui vita non termina alla chiusura della funzione, ma rimane in vita fino alla chiusura dell'applicazione. Serve per mantenere un qualche tipo di stato tra chiamate successive di una certa funzione. Come possibile utilizzo considera una funzione che restituisce il numero di volte in cui è stata chiamata:
unsigned count()
{
    static unsigned n = 0; // Alla prima chiamata di count viene inizializzato a 0
    return ++n;
}

Richiamando più volte questa funzione si ricevono uno dopo l'altro i primi numeri naturali diversi da zero.

Gianni911
"apatriarca":
Una variabile static locale ad una funzione è una variabile locale a tale funzione (che è quindi visibile solo all'interno di quella funzione) la cui vita non termina alla chiusura della funzione, ma rimane in vita fino alla chiusura dell'applicazione. Serve per mantenere un qualche tipo di stato tra chiamate successive di una certa funzione. Come possibile utilizzo considera una funzione che restituisce il numero di volte in cui è stata chiamata:
unsigned count()
{
    static unsigned n = 0; // Alla prima chiamata di count viene inizializzato a 0
    return ++n;
}

Richiamando più volte questa funzione si ricevono uno dopo l'altro i primi numeri naturali diversi da zero.


Corrisponde allo stesso utilizzo che si fa nelle classi con lo stesso static,per esempio per tenere il conto degli oggetti creati??
class A{
static contaogg=0;
//
public:
 A();
static funz();--->funzione per incrementare contatore statico
//
//
};

apatriarca
Qualcosa del genere, ma le variabili static sono nate dal C dove le classi non esistono. Per cui sono più che altro le variabili static nelle classi che sono un'evoluzione di questa idea e non il contrario. L'esempio che ho fatto è molto stupido, ma sono possibili anche utilizzi migliori. Per esempio, se si ha una funzione per restituire un certo numero di fibonacci, si potrebbe usare una o più variabili static per memorizzare i valori precedentemente calcolati in modo da non doverli ricalcolare tutte le volte. Ti ho mostrato l'esempio del contatore perché il codice era immediato.

hamming_burst
"Gianni91":

Quindi se dichiaro una variabile globale static,posso usarla solo nel file dove la creo,se la dichiaro non static ma extern,posso usarla al di fuori,ma allora se la dichiaro non static che cambia dal dichiararla static se tanto posso usarla solo in quel file??? :|

Una variabile dichiarata globale può essere (nella modularizzazione):
- static: perciò è locale nel modulo corrente, più moduli possono avere una variabile con lo stesso nome.
- non-static: il nome è UNICO in tutto il progetto, non esistono due varibili con lo stesso nome. Per far si che sia globale nel progetto deve essere dichiarato nell'HEADER con l'operatore extern e non nel codice oggetto.

Esempio

HEADER:
extern int pippo;
void genoveffa();


OBJ:
static int pluto
static void topolino()
int pippo


se la dichiari non-static e non intendi renderla globale nel progetto (cioè extern) è buona cosa renderla static. Tienila in mente come Code-rules, così non hai in giro nomi che non sai da dove escono (pensa a progetti enormi).


"apatriarca":
se si ha una funzione per restituire un certo numero di fibonacci, si potrebbe usare una o più variabili static per memorizzare i valori precedentemente calcolati in modo da non doverli ricalcolare tutte le volte.

come ottimizzazione ad un possibile codice con Fibonacci, a questa possibilità con le static non ci avevo davvero mai pensato. Dal tuo cappello delle idee, tiri sempre fuori idee semplici, ma interessanti :-)

Gianni911
"hamming_burst":

se la dichiari non-static e non intendi renderla globale nel progetto (cioè extern) è buona cosa renderla static. Tienila in mente come Code-rules, così non hai in giro nomi che non sai da dove escono (pensa a progetti enormi).

Dovrei aver capito,quindi una variabile globale non static,non extern sarebbe globale sono nel file dove la creo.In questo caso però anche se non utilizzabile negli altri file del progetto ,risulta nel mio progetto e quindi negli altri file ,non posso usare quel nome per una mia variabile globale..
giusto??

hamming_burst
"Gianni91":
[quote="hamming_burst"]
se la dichiari non-static e non intendi renderla globale nel progetto (cioè extern) è buona cosa renderla static. Tienila in mente come Code-rules, così non hai in giro nomi che non sai da dove escono (pensa a progetti enormi).

Dovrei aver capito,quindi una variabile globale non static,non extern sarebbe globale sono nel file dove la creo.In questo caso però anche se non utilizzabile negli altri file del progetto ,risulta nel mio progetto e quindi negli altri file ,non posso usare quel nome per una mia variabile globale..
giusto??[/quote]
mi pare di sì.
Accade questo: il compilatore nella "tabella dei nomi" rende legato ed unico il nome di questa variabile globale. Anche se informalmente è modificabile da un altro modulo (essendo globale) non hai nessun modo diretto per accedervi non essendo dichiarata in un header (con extern). Ma dovrebbe esserci qualche tipo di warning che ti avverte di possibili conflitti, non ricordo però in quale tipo di ambiente accade.

Gianni911
Perfetto,grazie davvero ad entrambi avevo un pò di confusione in testa, riguardo guesto argomento.. :smt023

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.