2012-04-27 13 views
6

Ho 2 file di origine (.c) denominati file1.c e file2.c che devono condividere tra loro una variabile, in modo che se in un file di origine la variabile è stata aggiornata, allora nell'altro file di origine quando si accede a questo variabile il cambiamento sarà visto.come condividere una variabile e il suo valore tra molti file sorgente in linguaggio c?

quello che ho fatto è creare un altro file source chiamato file3.c e intestazione file chiamato file3.h (che, ovviamente, è stato incluso nel file1.c file2.c e in file3.c)

in file3.c: 

int myvariable = 0; 

void update(){//updating the variable 

    myvariable++; 

} 

int get(){//getting the variable 

    return myvariable; 

} 

in file3.h: 

extern int myvariable; 

void update(void); 

int get(void); 

in file1.c: 
. 
. 
. 
printf("myvariable = %d",get());//print 0 
update(); 
printf("myvariable = %d",get());//print 1 
. 
. 
. 

in file2.c: 
. 
. 
. 
printf("myvariable = %d",get());//print 0 but should print 1 
. 
. 
. 

ma il problema è quando in file1.c aggiornamento è invocato e myVariable viene aggiornato il cambiamento non può essere visto in file2.c perché in file2.c quando ottiene è invocato e myVariable viene stampato quindi 0 è stato stampato, solo se in file2.c l'aggiornamento è invocato, quindi il cambiamento è stato visto. sembra che la variabile è in comune, ma per ogni file sorgente v'è un diverso valore di una variabile/memoria differente per questa variabile

+0

Come si compila questi file per creare l'eseguibile? – dpp

+0

in file1.c e file2.c dichiari anche "int myvariable;"? Non dovresti. –

+0

li compilo con un makefile che mi è stato dato da qualcuno e no non li dichiaro in nessun file, solo in file3.c e in file3.h come ho scritto. –

risposta

3

È possibile dichiarare la variabile come extern negli altri file quando si ha bisogno la variabile ...

+0

Sì, è possibile farlo, ma spesso è meglio non creare molte variabili globali. Creare la variabile in modo da avere l'ambito del file (statico) e fornire le funzioni di accesso necessarie in quel file. Il resto dell'applicazione (da file e scope diversi) * avrà * di utilizzare le funzioni di accesso. Di solito porta a un design più pulito e più facile da eseguire il debug e la manutenzione. – Chimera

2

includono file3.h in file1.c e file2.c

+0

l'ho già fatto come ho scritto "... chiamato file3.h (che, ovviamente, è stato incluso in file1.c file2.c e in file3.c)" –

+0

scusa può sembrare ovvio ma fa 'update' e 'get' ha' int myvariable' all'interno della funzione? in caso contrario, potresti aggiungere il codice get e update. – keety

+0

aggiornamento void (void) {myvariable ++; } int get (void) {return myvariable;} –

2

vi consiglio di evitare extern variabili a causa del codice di disordine - ripetendo gli esterni in ogni file usando che globale. In genere è preferibile associare la variabile globale a un determinato ambito di file rendendolo static. E quindi per utilizzare le funzioni interface per accedervi. Nei tuoi termini di esempio sarà:

// in file3.h 
void update(int x); 
int get(void); 

// in file3.c: 
static int myVariable = 0; 

void update(int x){ 
    myVariable = x; 
} 

int get(){ 
    return myVariable; 
} 

// in other files - include file3.h and use 
// update()/get() to access static variable 
+0

Sciocchezze. La dichiarazione della variabile 'extern' appartiene correttamente a' file3.h', che dovrebbe essere inclusa anche con il metodo, che riguarda il controllo degli accessi. Il clutter di codice non è il problema qui. – kittemon

+1

Il mio metodo non espone la variabile 'extern' - solo due funzioni per leggere/scrivere su di essa. A volte è anche un buon approccio. –

+0

0x69 - non funziona per me. se invoco questo aggiornamento (5) in file1.c e poi stampato lì - verrà stampato 5. ma dopo di ciò quando invoco get() da file2.c e lo stampo, 0 verrà stampato e non 5 come vorrei. –

2

Ecco solo una possibile soluzione. Facendo ciò, la variabile non è globale per l'intera applicazione e può essere solo letta/scritta per l'utilizzo delle funzioni di accesso. Per favore fammi sapere se hai domande.

Files: access.c access.h file2.c main.c
Compilare con: gcc main.c file2.c access.c -o test
Run: ./test

File: main.c

#include <stdio.h> 
#include "access.h" 

int main(int argc, char *argv[]) 
{ 
    int value; 


    put(1); 
    printf("%d\n", get()); 

    put(getValue() + 1); 
    printf("%d\n", getValue()); 

    return(0); 
} 

File: access.c

#include "access.h" 

static int variable = 0; 


int get(void) 
{ 
    return(variable); 
} 

void put(int i) 
{ 
    variable = i; 
    return; 
} 

File: file2 .c

#include <stdio.h> 
#include "access.h" 


int getValue(void) 
{ 
    int i = get(); 

    printf("getValue:: %d\n", i); 

    put(++i); 
    printf("after getValue:: %d\n", get()); 
    return(i); 
} 

File: access.h

extern int getValue(void); 
extern int get(void); 
extern void put(int i); 

Ed ecco l'output di esecuzione:

[[email protected] SO]# ./test 
1 
getValue:: 1 
after getValue:: 2 
getValue:: 3 
after getValue:: 4 
4 

Spero che questo aiuta.

Problemi correlati