2012-04-27 4 views
6

Ich habe 2 Quelldateien (.c) namens file1.c und file2.c, die zwischen ihnen eine Variable, teilen müssen, so dass, wenn in einer Quelldatei die Variable aktualisiert wurde, dann in der anderen Quelldatei, wenn Sie darauf zugreifen variabel wird die Änderung gesehen.Wie teilt man eine Variable und ihren Wert zwischen vielen Quelldateien in c-Sprache?

was ich tat, ist eine andere Quelldatei erstellen file3.c und Header-Datei mit dem Namen file3.h genannt (was natürlich wird in file1.c file2.c und in file3.c aufgenommen)

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 
. 
. 
. 

aber das Problem ist, wenn in file1.c Update aufgerufen wird und myvariable aktualisiert die Änderung nicht in file2.c weil in file2.c gesehen werden, wenn get aufgerufen wird und myvariable gedruckt wird, dann wird 0 gedruckt worden ist, nur dann, wenn in file2.c Update wird aufgerufen, dann wird die Änderung gesehen. scheint es, wie die Variable geteilt wird aber für jede Quelldatei gibt es eine andere Variablenwert/verschiedene Speicher für diese Variable

+0

Wie kompilieren Sie diese Dateien, um die ausführbare Datei zu erstellen? – dpp

+0

in file1.c und file2.c deklarieren Sie auch "int myvariable;"? Du solltest nicht. –

+0

Ich kompiliere sie mit einem Makefile, das ich von jemandem gegeben habe und nein, ich deklariere sie nicht in irgendeiner Datei, nur in file3.c und in file3.h, wie ich geschrieben habe. –

Antwort

3

Sie die Variable deklarieren können als extern in den anderen Datei, wenn Sie die Variable benötigen ...

+0

Ja, das kann gemacht werden, aber oft ist es besser, nicht viele globale Variablen zu erstellen. Erstellen Sie die Variable, um den Dateibereich (statisch) zu erhalten, und stellen Sie Zugriffsfunktionen bereit, die in dieser Datei benötigt werden. Der Rest der Anwendung (aus verschiedenen Dateien und Bereichen) * muss dann die Zugriffsfunktionen verwenden. Normalerweise führt dies zu einem saubereren Design und einfacher zu debuggen und zu warten. – Chimera

2

umfassen file3.h in file1.c und file2.c

+0

Ich habe es schon gemacht, als ich schrieb "... genannt file3.h (was natürlich in file1.c file2.c und in file3.c enthalten ist)" –

+0

sorry kann offensichtlich scheinen, aber '' update' und Haben Sie 'int myvariable' in der Funktion? Wenn nicht, könnten Sie den Code zum Abrufen und Aktualisieren hinzufügen. – keety

+0

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

2

ich empfehle wegen der Code Krempel extern Variablen zu vermeiden - Externen in jeder Datei, die global zu wiederholen. Es ist normalerweise besser, die globale Variable an einen Dateibereich zu binden, indem Sie sie static machen. Und dann um interface Funktionen zu verwenden, um darauf zuzugreifen. In Ihrem Beispiel Begriffe wird es sein:

// 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

Unsinn. Die 'extern'-Variablendeklaration gehört richtigerweise zu 'file3.h', was auch bei Ihrer Methode, die sich auf die Zugriffskontrolle bezieht, unbedingt enthalten sein müsste. Code Clutter ist hier nicht das Problem. – kittemon

+1

Meine Methode macht 'extern' Variable nicht verfügbar - nur zwei Funktionen zum Lesen/Schreiben. Manchmal ist es auch ein guter Ansatz. –

+0

0x69 - es funktioniert nicht für mich. wenn ich dieses Update (5) in file1.c aufrufen und dann dort ausdrucken - es wird 5. drucken, aber danach, wenn ich get() von file2.c aufrufen und es ausdrucken, dann wird 0 gedruckt und nicht 5, wie ich möchte. –

2

Hier ist nur eine mögliche Lösung. Dabei ist die Variable nicht global für die gesamte Anwendung und kann nur mit den Zugriffsfunktionen gelesen/beschrieben werden. Bitte lassen Sie mich wissen, wenn Sie Fragen haben.

Dateien: access.c access.h file2.c main.c
Compile mit: gcc main.c file2.c access.c -o test
Run: ./test

Datei: 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); 
} 

Datei: access.c

#include "access.h" 

static int variable = 0; 


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

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

Datei: 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); 
} 

Datei: access.h

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

Und hier ist die Laufleistung:

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

Ich hoffe, das hilft.

Verwandte Themen