Newsgroup: it.comp.lang.c
Titolo: Conformita' di questo codice agli standard

#include <stdio.h>
int somma(int vett[])
{
  int s = vett[0] + vett[1];
  return s;
}
int main()
{
  int v[2]={10,20};
  printf("la somma e' %d\n",somma(v));
  return 0;
}
Funziona, e compilato con:
cc -ansi -pedantic -Wall prova.c
non segnala nessun warning, ma io sapevo che le variabili dovessero essere
inizializzate solo con espressioni costanti, per essere conformi allo
standard. Non che non sia possibile, solo chiedo a chi na ha accesso cosa
dice in proposito lo standard ANSI C89
Ciao a tutti.
Roberto.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it


Non ho lo standard sottomano, ma se non ricordo male il discorso ale per 
le variabili globali/statiche, mentre "int s" è automatica.
...qualcuno ha lo standard?


Per le variabili con storage duration statica (cioè le variabili
esterne e le locali dichiarate con static) ovviamente
l'inizializzatore deve essere costante (perchè l'inizializzazione
avviene prima dell'esecuzione del programma).
Per le automatiche scalari (interi, floating, puntatri ed
enumerazioni) l'inizializzatore può essere un'espressione valutata a
run-time.
Per le automatiche aggregate (array e strutture):
 1) se l'inizializzatore NON è una initilizer-list (cioè una lista di
valori compresa tra { e } come in int a[]= {1,2,3} )
     l'inizializzatore può essere un'espressione valutata a run-time
(questo caso si presenta solo per le strutture,
 ad esempio in struct s f(void), x = f(); per gli array non sono
legali queste forme)
 2) se l'inizializzatore è una initilizer-list (cioè una lista di
valori compresa tra { e } come in int a[]= {1,2,3} )
       - in C89 i valori nella lista devono essere costanti
       - in C99 (e C1X) i valori nella lista possono essere
espressioni valutate a run-time


Non ho lo standard sottomano ora, ma il concetto è semplice: le
inizializzazioni di costanti di durata statica hanno bisogno che il
valore sia conosciuto a compile-time (basta ricordarsi che sono
eseguite prima del main). Per le variabili automatiche, quindi, il
problema non si pone ;-)
Ciao!

   printf("la somma e' %d\n",somma(v));
...
Capisco che la questione non era tanto sul codice in sè quanto sulla
inizializzazione delle variabili. Però faccio ugualmente qualche commento.
Passi un array (in realtà la copia di un puntatore) a una funzione. 
La domanda è: chi è a conoscenza del numero di elementi dell'array? 
La funzione chiamata o quella chiamante? Una risposta frettolosa potrebbe 
essere: entrambe, perchè sia main() che somma() elaborano solo 2 elementi 
dell'array. Ma in realtà la risposta corretta è *nessuna*, perchè non c'è
nessun controllo sulla dimensione dell'array e sulla validità ("nullità")
del puntatore passato. Quindi, in teoria potresti passare dal main() 3 
parametri alla funzione somma() ed elaborarne 16 all'interno della funzione 
somma() stessa, senza magari neanche rendertene mai conto. In un programma 
di grandi dimensioni naturalmente questo è inaccettabile. Occorre fare 
un controllo sulla validità dei parametri passati. C'è chi dice di farlo 
dalla funzione chiamante. Ma personalmente (e gli standard di sicurezza 
CERT me lo confermano) è più robusto un programma in cui la dimensione 
venga passata come parametro e il test di nullità sia fatto (anche) 
localmente
alla funzione interessata. Questo puo' causare un leggero overhead (in
programmi di grandi dimensioni), ma è un bel modesto prezzo da pagare per
una stabilità assicurata.
-- 
Vincenzo Mercuri | 
www.backbox.org