Newsgroup: it.comp.lang.c
Titolo: Sorgente su più File:problemino

Ciao a tutti...avrei un problemino...ho infatti realizzato un programma e lo
suddiviso su tre file:
file 1: principale.c  contiene #include e funzione main.
file 2: prototipi.h (lo scrivo tanto non è lunghissimo):
typedef struct e{
     char nome[20];
     char numero[20];
     struct e *next;}dato;
dato *testa=NULL;
void stampa_file (dato *testa);
dato* insafter(dato *testa,dato *p);
void stampa(dato *testa);
dato *alloca(void);
file 3: funzioni.c contiene le funzioni usate e gli # include necessari al
loro funzionamento.
Il fatto è questo, se compilo il programma  con la seguente riga di codice:
dato *testa=NULL;
nel file prototipi.h
il compilatore (Borland 3.1) mi da errore: "Undefined symbol NULL".
Se sposto la riga nel file 1 (quello con il main), tutto funziona alla
perfezione! Dove sbaglio (e sbaglio di sicuro ^_^)?
Grazie 1000 e scusate per il messaggio troppo lungo!
Enrico S.

perfezione! Dove sbaglio (e sbaglio di sicuro ^_^)?
Nell'header devi mettere solo la dichiarazione di testa, senza
attribuirgli alcun valore, es:
dato *testa;
Poi nel programma principale, fuori dal main se come penso e' una
variabile globale:
dato *testa=NULL;
ciao, acc.   
a...@libero.it

Capito, quindi posso solo dichiarare ma non inizializzare nell'Header file?
Grazie 1000 per la risposta!
Enrico S.
--
Webmaster della Pagina NON Ufficiale del SonyCRX100
SonyCRX120,  SonyCRX140E/S, SonyCRX100EX, HP8100
HP8200, HP9100 & HP9200
http://www.freeweb.org/computer/SonyCRX100/

Capito, quindi posso solo dichiarare ma non inizializzare nell'Header file?
Certo, altrimenti se l'header viene incluso in diversi file, come
avviene normalmente, avresti una copia della variabile per ogni file !
ciao, acc.   
a...@libero.it

dato *testa=NULL;
Le due cose che hai scritto sono perfettamente equivalenti
(se non attribuisci un valore la variabile viene inizializzata
a zero per gli interi/numeri in virgola mobile e a NULL per
i puntatori). 
Quello che bisogna mettere negli header file e':
  extern dato *testa;
la parola "extern" indica proprio che voglio solamente
dichiarare l'uso di una variabile esportata da un altro file.
Forse ti sei confuso con i prototype di funzione dove la
parola extern e' superflua... dire
  extern int foo(void);
oppure
  int foo(void);
e' la stessa cosa. Con le variabili no.
HTH
Andrea
--
Andrea Griffini, Programmer
http://www.netservers.com/~agriff

 perfezione! Dove sbaglio (e sbaglio di sicuro ^_^)?
NULL non è una keyword del compilatore per cui se vuoi usarla deve pur
essere definita da qualche parte, e questa qualche parte e' proprio stdlib.h
che contiene questo :
#define NULL    ((void *)0)
quindi se tu non includi nel tuo file "prototipi.h" l'header <stdlib.h > (o
qualsiasi altro header che definisca NULL) ovviamente il compilatore non sa
che cosa compilare di fronte alla parola NULL.

i puntatori). 
No non sono affatto equivalenti dal punto di vista di contenuto delle
variabili infatti il fatto di aver dichiarato una variabile di
qualunque tipo essa sia non significa anche averla inizzializzata.
infatti mentre la seconda dichiarazione siamo sicuri che il puntatore 
punti a NULL nella prima non possiamo esserne sicuri, dipende 
da che cosa c'era precedentemente in memoria. tutto cio' vale per 
gli array per i char per gli int .... e cosi anche per i puntatori.
Un'altra convinzione (scusatemi se divago) anche essa sbagliata 
e' che la free oltre a liberare la memoria inizzializzi a "qualche
cosa utile per noi" anche la memoria referenziata e ponga a null il
puntatore passato alla free.
claudio

 No non sono affatto equivalenti dal punto di vista di contenuto delle
Griffini correggimi se sbaglio!
Claudio quello che dici tu e' valido per le variabili locali alle funzioni e
non static, mentre per le variabili globali o quelle dichiarate static, e'
vero quello che dice Griffini.
Nel post si parlava di variabilil globali.
ciao
donCiccio

parola extern e' superflua... dire
Ooops, hai ragione......la fretta !
ciao, acc.   
a...@libero.it

 NULL non č una keyword del compilatore per cui se vuoi usarla deve pur
