Newsgroup: it.comp.lang.c
Titolo: extern char *

Salve a tutti,
sto cercando di risolve un problema con l'extern ma non riesco di
venirne a capo:
ho in un file header.h la seguente dichiarazione:
extern char *main_path;
tale variabile viene inizializzata in un file conentente il main, in un
altro file2.c devo riutilizzare la variabile main_path con il valore a
cui è stata inizializzata nel main. nel file2.c include il file
header.h in cui c'è la dichiarazione di cui sopra!!
ma se provo a utilizzare quella variabile quando cerco di compilare i
file.o mi da errore!
cosa devo fare!chiedo il vostro aiuto altrimenti sono nei guai!!
Grazie a tutti

mi dice che non trova la variabile main_path!!
Giovanni ha scritto:


 mi dice che non trova la variabile main_path!!
#include "header.h"
-- 
Horst

lo includo il file altrimenti mi darebbe gia errore quando compilo i
file c
a me l'errore lo da quando creo il file eseguibile dai file object!!
Horst Kraemer ha scritto:


il file heder lo includo altrimenti l'errore me lo darebbe direttamente
in fase di creazione dei file.o!!

 a me l'errore lo da quando creo il file eseguibile dai file object!!
Probabilmente non hai "definito" la variabile.
In C ci sono due aspetti relativi alle variabili, la "dichiarazione" e la
"definizione". Quando dichiari una variabile, semplicemente istruisci il
compilatore del fatto che esiste un identificatore con quel nome e quel
tipo.
Quando definisci, invece, chiedi al compilatore di riservare uno spazio di
memoria sufficiente ad ospitare la variabile e _in piu`_ la dichiari.
In parole povere, se scrivi
   char * main_path;
stai definendo la variabile, mentre con
   extern char * main_path;
la dichiari soltanto. In particolare dici al compilatore: "quando trovi
la variabile main_path, considerala valida e trattala come se fosse un
puntatore a char, perche' da qualche altra parte ho definito tale
variabile e la voglio riusare".
Quindi, una variabile dichiarata _deve_ essere sempre definita da qualche
parte. Se questo non succede, il linker (e non il compilatore) ti da` un
messaggio d'errore perche' non riesce a trovare la locazione di memoria
associata a quella variabile.
Sono convinto che nel tuo programma non hai definito main_path, l'hai
solo dichiarata.
Assicurati che in un file .c ci sia la definizione
   char * main_path;
e sicuramente funzionera` tutto.
Saluti,
Marco
-- 
To reply this message, please remove the no_ and _spam from my address.

io ho i seguenti file:
nodes.h contiene la dichiarazione extern char *main_path,
main.c che definisce una variabile globale char *main_path e la
inizializza infine
modulo.c in cui devo utilizzare la variabile main_path con il valore
dato nel main
quindi non ho capito se devo ridefinire nel file modulo.c la variabile
globale char *main_path che automaticamente prende il valore dato nel
main oppure posso utilizzarla direttamente perche è stata definita nel
file main.c?
grazie

On Sun, 15 May 2005, gabriele wrote:

No, non devi ridefinire nulla. Come compili il codice? Devi fare una
cosa di questo tipo
$ gcc -c main.c    % compila solo!
$ gcc -c modulo.c  % compila solo!
$ gcc main.o modulo.o % fa il linking e genera l'eseguibile
Oppure in alternativa
$ gcc main.c modulo.c


 wrote:

No. 
/* nodes.h */
extern char *main_path;
/* modulo.c */
#include "nodes.h"
int print(void) { return puts(main_path); }
/* main.c */
#include "nodes.h"  
char *main_path;
int main()
{
   main_path="toto";
   print();
   return 0;
}
-- 
Horst

 mi dice che non trova la variabile main_path!!
Ma hai definito la variabile o l'ha solo dichiarata extern?


 Ma hai definito la variabile o l'ha solo dichiarata extern?
L'errore che hai e` perche` includendo l'header file tu dichiari una 
variabile esterna (cioe` una variabile definita in un'altra unita` di 
compilazione).   In fase di link questa variabile non esiste.
================================
/* file.h */
extern char *main_path;
================================
/* file1.c */
#include "file.h"	/* si dichiara la variabile extern */
void func1(void)
{
    if (main_path == NULL) {
       .......
    }
    return;	
}
================================
/* file2.c */
#include "file.h"	/* si dichiara la variabile extern */
char *main_path;	/* si definisce la variabile */
			/* (cioe` si alloca la memoria) */
int main(int argc, char **argv)
{
     main_path = "stringa di inizializzazione";
     ........
     return 0;


grazie mille!!! con un esempio mi è sempre chiaro quello che prima non
capivo!! ho capito anche la diff tra definizione e dichiarazione!!!
a presto