Newsgroup: it.comp.lang.c
Titolo: non funzionano due for

Salve 
Ho problemi con questo programmino :
non viene per niente eseguito il secondo ciclo for.
Dove e' sbagliato il tutto ?
#include <stdio.h>
main ()
  {
   int a,c[10] ;
   for (a==0; a<10; a++) {
                printf (" \n inserire il valore  numero %d >>" , a);
                scanf("%d",&c[a]);
                };
   for (a==0;a<10;a++)  printf ("\n va bene"); ****non va
   printf (" \n Il valore massimo e' %d" , a );
 } 
Saluti 
Antonio.
E-mail   
adel...@media.cesvitec.it
(spammatemi pure tanto questo e-mail lo do a "bau" ed "oink").


Sono sbagliati entrambi:
for(a=0; a<10;a++)....    // cosa c'entra a==0?
il primo ti e' andato bene solamente perche' di default il compilatore ha
assegnato il valore 0 alla variabile a.
Bye.

 assegnato il valore 0 alla variabile a.
Non mi risulta che esistano valori di default per le variabili
automatiche. Secondo me è stato un puro caso che il primo loop abbia
funzionato. Infatti compilandolo con il DJGPP non viene eseguito neanche
quello.
EMG



Io sapevo che le variabili dichiarate nel main (ma non quelle
all'interno di functions) vengono  automaticamente inizializzate a
0...
Forse non è vero per tutti i compilatori...
Christian Salvaneschi
Casarza Ligure, Genova, Italy
e.mail: 
cr...@geocities.com
   web: 
http://www.geocities.com/SiliconValley/Lakes/5139

 Forse non č vero per tutti i compilatori...
Ti confondi con le variabili statiche cioč quelle dichiarate 'static'
all'interno di funzioni oppure dichiarate all'esterno di ogni funzione.
EMG

 quello.
L'inizializzazione a 0 di default e' diventato standard ISO, molti
compilatori anche precendenti lo facevano comunque (specialmente in
ambiente UNIX), quelli nuovi lo faranno di sicuro.
Ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |

 L'inizializzazione a 0 di default e' diventato standard ISO
E' stato approvato il C9X?  Da quando?  Se ti riferisci al Technical
Corrigendum 1 di ISO/IEC 9899:1990, per la subclause 6.5.7 di pagina
71 dice (l'enfasi su STATIC e' mia):
Change from:
"If an object that has STATIC storage duration is not initialized
explicitly, it is initialized implicitly as if every member that has
arithmetic type were assigned 0 and every member that has pointer type
were assigned a null pointer constant."
to:
"If an object that has STATIC storage duration is not initialized
explicitly, then: if it has pointer type, it is initialized to a null
pointer; if it has arithmetic type, it is initialized to zero; if it
is an aggregate, every member is initialized (recursively) according
to these rules; if it is a union, the first named member is
initialized (recursively) according to these rules."
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

fidarsi.
Fortunatamente, oggi (e da Luglio scorso, ma quello che e`
stato approvato come Standard e` esattamente l'ultimo draft,
lo stesso che era stato approvato in Novembre 1997) non e`
piu` cosi`: *E`* uno standard, e quindi ci si puo` fidare di esso
(e dei compilatori, presumibilmente in versioni recenti e bene
aggiornate, che lo implementano, almeno in buona parte).
Lo standard puo` oggi essere acquistato, in rete, per 10
dollari mi pare, al sito dell'American National Standards
Institute; non e` opera di consultazione agevole, e averla
messa in formato PDF (Acrobat Reader) non migliora
certo le cose, sigh.  Comunque, la sezione 8.5 recita,
in parte e tradotta...:
[8.5.5] 
"Zero-inizializzare" un oggetto di tipo T significa...:
    -- se T e` un tipo scalare (3.9), la memoria e` posta
        al valore di 0 (zero) convertito a T
    [snip]
"Default-inizializzare" un oggetto di tipo T significa...:
    [snip] -- altrimenti, la memoria dell'oggetto e`
                  zero-inizializzata
[8.5.7]
Un oggetto il cui inizializzatore e` una coppia vuota
di parentesi, cioe` (), sara` default-inizializzato
(Questo e` ben diverso da [8.5.9] "Se nessun
inizializzatore e` specificato per un oggetto"; in
questo caso, si cadrebbe nella specifica "ha
valore indeterminato").
Riassumendo, dunque, oggi, in C++ Standard,
qualsiasi nome di tipo (anche i built-in, come
int, float, ecc) puo` essere usato, seguito da una
coppia vuota di parentesi, per richiedere in modo
esplicito l'inizializzazione di default per quel tipo,
che per gli scalari (int, float, ecc) coincide con
la zero-inizializzazione.
Questo, naturalmente, e` stato aggiunto proprio
(nel draft del 1996, se ben ricordo, quindi la
stragrande maggioranza dei compilatori C++ si
dovrebbe gia` essere adeguata!) per comodita`
di chi scrive template, che grazie a questa
naturale estensione del concetto di "costruttore
di default" puo` permettersi in molti piu` casi di
evitare di dovere specializzare un dato template
per i casi di tipi built-in.  Notare, e questo e`
molto importante, che nulla, invece, cambia se
*nessun inizializzatore e` specializzato*: il
costruttore di default in questo caso e` chiamato
solo per oggetti-classe e oggetti statici e globali,
mentre oggetti built-in auto e membri di classi
sono NON-inizializzati (cosa assai scomoda,
sigh, ma necessaria per garantire il massimo
assoluto delle prestazioni in certi casi -- come
sappiamo, il linguaggio C++ non impone _mai_,
di per se`, dei costi di run-time superiori a quelli
del linguaggio C, e questa linea-guida di progetto
non viene mai violata, neppure dove gli overhead
sarebbero minimi e la comodita` tanta).


 Riassumendo, dunque, oggi, in C++ Standard,
Peccato che la questione fosse sul C, e si svolgesse su it.comp.lang.c .
Lo standard C e' quello che ho citato io, punto per punto; sia quello
attuale che quello prossimo venturo.
Penso che tu non abbia capito di cosa si stesse parlando.


 E' stato approvato il C9X?  Da quando?
No, non e' stato approvato --- sono andato a controllare.
L'ultimo draft del comitato (WG14/N843, 3 Agosto 1998) recita, a
pagina 113, punto 6.7.10: "If an object that has automatic storage
duration is not initialized explicitly, its value is indeterminate".
Sembra che tu sia stato male informato.


 [...]
Chiedo scusa mi sono confuso.
Ciao.


 ambiente UNIX), quelli nuovi lo faranno di sicuro.
Ma sei sicuro? A parte il fatto che il DJGPP (GCC 2.8.1b) non lo fa, mi
sembrerebbe strano che fosse stato introdotto questo overhead: per ogni
variabile automatica ci sarebbe una assegnazione extra!
EMG

 initialized (recursively) according to these rules."
Infatti mi pareva...
EMG

 non viene mai violata,
Questo mi sembra che deponga a favore della mia tesi, o sbaglio?
EMG

 Peccato che la questione fosse sul C, e si svolgesse su it.comp.lang.c .
Comunque l'inizializzazione a 0 di una variabile automatica non esiste
nemmeno in C++.
EMG