Newsgroup: it.comp.lang.c
Titolo: enum, importante.

Salve a tutti, ho un problema.
Se io ho una struttura con un array del tipo:
struct es {
....
short int valore[MAX_VALORE]
....}
e poi dichiaro:
enum nome_valore {
      PRIMO,
      SECONDO,
      TERZO
}
posso assegnare cosě l'array nella struttura?
struct es = 
{...campi della struttura..., {PRIMO}
}
In questo caso PRIMO occupa la posizione 0 dell'array giusto?
E per visitare tutto l'array con un ciclo for come devo fare?
es.valore[0] = PRIMO , giusto?
Posso fare?:
for (i = 0; i < MAX_VALORE; i++) {
     if (es.valore[i] == NULL)
             break;
     if (i >1) {
          ....in questo caso i = 1 non č uguale a 0? e i = 2 ? non
sono = 0 tutti fino all'ultimo elemento?
 

sono = 0 tutti fino all'ultimo elemento?
Non ho capito :(
--
Andrea Laforgia
andrea_...@bigfoot.com

Puň darsi che abbia visto male, ma mi sembra che vi siano parecchi errori:
- fai conto sull'inizializzazione a zero dei valori che non setti
esplicitamente
- confronti con NULL intendendo (credo) un valore non inizializzato, emntre
invece andrebbe usato solo per testare i valori dei puntatori, e comunque se
li inizializzi esplicitamente
- assegni un solo elemento ad un array, ma non capisco cosa vorresti
intendere. Impostare solo il primo elemento e lasciare indeterminati gli
altri? Mi sembra poco affidabile, e se fossi il compilatore non te lo farei
passare :-))
Inoltre ho l'impressione che tu vorresti avere un array in cui ogni elemento
contiene il suo indice come tipo enumerativo, e non ne capisco l'utilitŕ...
Ciao
--
Alessandro Monti

Alessandro Monti
Il mio problema dovrebbe trovarsi nel punto :
if ( i > 1) {
....
č possibile che quell' i non sia riferito all'elemento dell'array? Ho
l'impressione che il ciclo For precedente non riesca a visitare
l'array, e quindi quest' if mi puň causare dei problemi.
Grazie
Giacomo

>li inizializzi esplicitamente
L'uso piu' comune e' questo, ma non e' detto, comunque, che NULL sia
usato solo per confrontare puntatori.
--
Andrea Laforgia
andrea_...@bigfoot.com

 l'array, e quindi quest' if mi può causare dei problemi.
Se sei sicuro che tutti gli elementi successivi al primo siano zero, allora
if (es.valore[i] == NULL)
     break;
 ti fa terminare il ciclo al secondo elememto, così che il terzo (i>1) non
viene mai raggiunto.
In realtà non ho capito bene quale sia il problema, il codice, a parte
qualche miglioramento stilistico, mi pare ok, ma non sapendo cosa deve fare
è difficile dare suggerimenti.
--
Alessandro Monti

 usato solo per confrontare puntatori.
Beh, io ero rimasto che il NULL fosse usato per il confronto su puntatori,
benchè in C++ sia stato definito come zero una volta per tutte.
In quali altre occasioni lo si potrebbe usare, a parte dove si userebbe lo
zero (che comunque preferirei per i tipi non-puntatore)
Non credo che tu intenda:
float a;
...
if (a==NULL)
    ...
anche se sarebbe sicuramente possibile.
--
Alessandro Monti

zero (che comunque preferirei per i tipi non-puntatore)
int string_length( const char * s ) 
{
    int i ;
    for ( i = 0 ; s[i] != NULL ; i++ ) ;
    return (i-1) ;
}
--
Andrea Laforgia
andrea_...@bigfoot.com

>     for ( i = 0 ; s[i] != NULL ; i++ ) ;
Ah, io comunque avrei messo:
for (i=0; s[1]; i++);
oppure esplicitamente
for (i=0; s[1] != '\0'; i++);
Visto che comunque, in C, NULL potrebbe essere diverso da '\0'.
O forse non sono molto aggiornato, ma se devo testare lo zero di fine
stringa, preferisco usare la notazione implicita o al massimo quella
esplicita con un tipo carattere.
Mi risulta infatti che le stringhe siano, in C, terminati proprio da '\0',
non da NULL.
Mi sbaglio in qualcosa?
--
Alessandro Monti

Mi sbaglio in qualcosa?
1) '\0' equivale al valore 0
2) NULL e' definito come 0
           ||
           vv
3) '\0' equivale a NULL
--
Andrea Laforgia
andrea_...@bigfoot.com

 3) '\0' equivale a NULL
A me pare che sia un po' come se:
1) Definissi sempre
   #define VALORE_ALTO 0
2) scrivessi sempre
    if (a==VALORE_ALTO)
        printf ("Il valore è zero");
O no?
Ovvero, mi pare che NULL sia stato inventato per l'uso con i puntatori, non
come sostituto dello zero. Che poi sia definito proprio come zero e che
quindi il codice lo possa usare in ogni posto dove si userebbe uno zero,
comunque rende il codice un "tantino" meno leggibile per chi non usa la tua
convenzione.
Altrimenti, nessuno vieterebbe neanche di scrivere:
int i;
...
for (i=NULL; i< 10; i++)
    ...
e varie amenità del genere. Io trovo che sia un voler rendere il codice
criptico, invece che chiaro. In C è senz'altro possibile e facile rendere le
cose complicate a chi legge, ma non mi pare sia una prassi consigliabile.
--
Alessandro Monti

convenzione.
Quale convenzione ?
Io non uso alcuna convenzione...
NULL non e' stata inventata specificamente per i puntatori, e' solo
una macro con valore 0.
Lo standard definisce una "null pointer constant" come una qualsiasi
espressione intera con valore 0, o "castata" con (void *).
NULL viene quindi espansa in una "null pointer constant".
Questo non significa, pero', che sia un puntatore, vuol solo dire che
nei confronti tra puntatori, al valore di NULL viene applicato un
determinato cast. 
Ma, logicamente, non e' sbagliato utilizzare questa macro ogni qual
volta si utilizzi la costante 0.
--
Andrea Laforgia
andrea_...@bigfoot.com

 tail -12
        NULL should *not* be used when another kind of 0 is required,
        even though it might work, because doing so sends the wrong
        stylistic message.  (Furthermore, ANSI allows the definition of
        NULL to be ((void *)0), which will not work at all in non-
        pointer contexts.)  In particular, do not use NULL when the
        ASCII null character (NUL) is desired.  Provide your own
        definition
                #define NUL '\0'
        if you must.
[fok@fokhouse fok]$
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Grazie per l'aiuto. Se andava avanti così, mi si rimpiccioliva l'ego a
dimensioni atomiche.
Dovrò comunque pensare a ritrovare lo standard ed a studiarmelo, mi sa che
col tempo la memoria mi tradisce.
Conversare su NG aiuta molto, anche quando non ci si trova d'accordo :-)
--
Alessandro Monti