Newsgroup: it.comp.lang.c
Titolo: dichiarare static un vettore

Ciao a tutto il ng. Ho da poco iniziato a studiare un pň di c con il 
deitel&deitel. A pag 189 alla fig 6.11 mostra un codice di esempio che 
spiega come dichiarare static un vettore e le differenze con quello 
automatico. Ora, io l'ho fatto e l'ho compilato, ma static non funziona, č 
come se non ci fosse. Da valori come se fosse automatica. Ecco il codice 
(per chi non ha questo libro):
<CODE>
/* I vettori statici sono inizializzati a zero */
#include <stdio.h>
void staticArrayInit(void);
void automaticArrayInit(void);
main()
{
        printf("First call to each function:\n");
        staticArrayInit();
        automaticArrayInit();
        printf("\n\nSecond call to each function:\n");
        staticArrayInit();
        automaticArrayInit();
        return 0;
}
/* Funzione per dimostrare l'uso di un vettore locale statico */
void staticArrayInit(void)
{
        static int a[3];
        int i;
        printf("\nValues on entering staticArrayInit:\n");
        for (i = 0; i <= 2; i++)
                printf("array1[%d] = %d   ", i, a[i]);
        printf("\nValues on exiting staticArrayInit:\n");
        for (i = 0; i <= 2; i++)
                printf("array2[%d] = %d   ", i, a[i] + 5);
}
/* Funzione per mostrare l'uso di un vettore locale automatico */
void automaticArrayInit(void)
{
        int a[3] = {1, 2, 3};
        int i;
        printf("\n\nValues on entering automaticArrayInit:\n");
        for (i = 0; i <= 2; i++)
                printf("array1[%d] = %d   ", i, a[i]);
        printf("\nValues on exiting automaticArrayInit:\n");
        for (i = 0; i <= 2; i++)
                printf("array2[%d] = %d   ", i, a[i] + 5);
}
</CODE>
L'output č il seguente:
---------------------------
First call to each function:
Values on entering staticArrayInit:
array1[0] = 0   array1[1] = 0   array1[2] = 0
Values on exiting staticArrayInit:
array2[0] = 5   array2[1] = 5   array2[2] = 5
Values on entering automaticArrayInit:
array1[0] = 1   array1[1] = 2   array1[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6   array2[1] = 7   array2[2] = 8
Second call to each function:
Values on entering staticArrayInit:
array1[0] = 0   array1[1] = 0   array1[2] = 0
Values on exiting staticArrayInit:
array2[0] = 5   array2[1] = 5   array2[2] = 5
Values on entering automaticArrayInit:
array1[0] = 1   array1[1] = 2   array1[2] = 3
Values on exiting automaticArrayInit:
array2[0] = 6   array2[1] = 7   array2[2] = 8
--------------------------
Mentre invece a Values on entering staticArrayInit della Second call to each 
function dovrebbe visualizzare gli array1 a 5 e gli array2 a 10. 
Perchč non lo fa, e invece di conservare il valore precedente, reinizializza 
il vettore? Se č static non dovrebbe farlo, o sbaglio?

}
Prova a riscriverre le procedura cosi':
void staticArrayInit(void)
{
        static int a[3];
        int i;
        printf("\nValues on entering staticArrayInit:\n");
        for (i = 0; i <= 2; i++)
                printf("array1[%d] = %d   ", i, a[i]);
        printf("\nValues on exiting staticArrayInit:\n");
        for (i = 0; i <= 2; i++)
	{
	a[i] +=5;
                printf("array2[%d] = %d   ", i, a[i]);
	}
}
Porta l'incremento degli elementi fuori dalla printf. Fai  lo  stesso
anche per l'altra funzione.
BYE
GIGI
-- 
   THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG
visit my home page:
http://web.tiscali.it/KilometroZero

 reinizializza il vettore? Se è static non dovrebbe farlo, o sbaglio?
Il fatto e` che tu non modifichi in nessun modo l'array. Con la modifica
che ti ho suggerito, la funzione  mostra alle prima chiamata la sequenza
0,0,0  e 5,5,5  mentre alla  seconda chiamata  l'output e`  5,5,5 e  poi
10,10,10.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Do, or do not. There is no try.

 Il fatto e` che tu non modifichi in nessun modo l'array. 
Temo di non aver capito. Se scrivo una cosa del genere:
#include <stdio.h>
main()
{
   int i, a[3] = {5, 7, 9};
   for (i = 0; i <= 2; i++) 
      printf("%d\t%d\n", i, a[i] + 3);
}
mi da questo output:
0       8
1       10
2       12
Perchè in questo caso l'array viene modificato mentre in quell'altro codice 
no? Perchè ha bisogno che l'incremento debba venir messo fuori la printf?

Quello che succede è normale!!!
Se fai:
printf("%d", a[1] + 5);
lui ti visualizza il valore corretto, però non memorizza il valore. Il
compilatore la converte in qualcosa del genere:
tmp = a[1] + 5;
printf("%d", tmp);
di conseguenza il contenuto di a[1] non viene modificato...
Invece se fai questo:
a[1] = a[1] + 5;
gli dici di sommare all'elemento indicato il valore 5 e di RIPORRE IL
RISULTATO NELLA STESSA POSIZIONE DEL VETTORE, quindi viene conservato!
--------------------------------
Inviato via 
http://usenet.libero.it

 no? Perchè ha bisogno che l'incremento debba venir messo fuori la printf?
quindi anche in questo caso l' array non viene modificato


> Quello che succede è normale!!!
Ho fatto un mezzo casino io. Prima di analizzare un esempio del libro cerco 
di farlo io in base ai dati che dà prima e a quello che fino a quel punto 
ha spiegato. L'avevo fatto proprio in quel modo, cioè sbagliato, poi vado a 
controllare e a ricopiare quello del libro sul mio editor, ma "sembrava" la 
stessa cosa del mio. Invece mi è successa una cosa tipo "La lettera rubata" 
di Edgar A. Poe. Sul libro era printf("array1[%d] = %d   ", i, a[i] += 5); 
ma io più e più volte ho letto a[i] + 5 (che poi era quello che avevo 
scritto io, sbagliando).
Vi ringrazio, ora almeno ho le idee molto più chiare.

 scritto io, sbagliando).
Questo mio commento non c'entra con il problema in se, e' solo una nota di 
stile.
Un assegnamento nascosto in una printf e la cosa ideale se vuoi partecipare 
al prossimo IOCCC :)  Anche se corretto, sarebbe meglio mettere piu' in 
evidenza gli assegnamenti, magari dedicandogli una riga propria.
    for (i=0; i<3; i++) {
        a[i] += 5;
        printf("array1[%d] = %d   ", i, a[i]);
    }
Mettere l'assegnamento nella printf e' una di quelle ottimizzazioni infime e 
premature (v. Knuth) che creano solo problemi di mantenibilita' del codice.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 premature (v. Knuth) che creano solo problemi di mantenibilita' del
codice.
... non è un ottimizzazione..
in più è un errore ri design.. qual'e' lo scopo di ArrayInit?

> qual'e' lo scopo di ArrayInit?
E' retorica? Se non lo è, lo scopo (almeno per gli autori del libro) sarebbe 
quello di far vedere la differenza tra un array statico e uno automatico.

quello di far vedere la differenza tra un array statico e uno automatico.
si.. era retorica..
fa due cose quella funzione.. due cose differenti nella stessa
funzione..
ciao
	sbirish