2012-04-27 14 views
6

मैं 2 स्रोत फ़ाइलें (ग) का नाम दिया file1.c और file2.c जो उन दोनों के बीच एक चर, साझा करने के लिए की जरूरत है ताकि अगर एक स्रोत में चर अन्य sourced फ़ाइल में तो अद्यतन किया गया है, जब इस तक पहुँचने के लिए फ़ाइल परिवर्तनीय परिवर्तन देखा जाएगा।सी भाषा में कई स्रोत फ़ाइल के बीच एक चर और उसके मूल्य को साझा करने के लिए कैसे?

मैं क्या किया एक अन्य स्रोत कहा जाता file3.h (जो, ज़ाहिर है, file1.c file2.c में और file3.c में शामिल किया गया है) कहा जाता 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 
. 
. 
. 
बनाने है

लेकिन जब file1.c अद्यतन में शुरू हो जाती है और myvariable परिवर्तन क्योंकि file2.c में file2.c में नहीं देखा जा सकता अद्यतन किया जाता है जब प्राप्त शुरू हो जाती है और myvariable तो मुद्रित 0 मुद्रित किया गया है, केवल file2.c में अगर है समस्या है अद्यतन लागू किया गया है तो परिवर्तन देखा गया है। ऐसा लगता है चर की तरह साझा किया जाता है, लेकिन प्रत्येक स्रोत फ़ाइल के लिए एक अलग चर मूल्य/इस चर

+0

निष्पादन योग्य बनाने के लिए आप इन फ़ाइलों को कैसे संकलित कर रहे हैं? File1.c और file2.c में – dpp

+0

क्या आप "int myvariable" भी घोषित करते हैं? तुम्हे नही करना चाहिए। –

+0

मैं उन्हें एक makefile जो मैं किसी के द्वारा दिया गया था के साथ संकलन और नहीं, मैं उन्हें किसी भी फाइल में नहीं घोषित करते हैं, केवल file3.c में और file3.h में के रूप में मैं लिखा था। –

उत्तर

3

आप चर घोषणा कर सकते हैं के रूप में दूसरों में extern फाइल जब आप चर की आवश्यकता है ...

के लिए अलग स्मृति होती है फ़ाइल है कि वैश्विक का उपयोग कर प्रत्येक और हर में externs दोहरा -
+0

हां ऐसा किया जा सकता है, लेकिन अक्सर कई वैश्विक चर बनाने के लिए बेहतर नहीं होता है। फ़ाइल स्कोप (स्थिर) रखने के लिए चर बनाएँ और उस फ़ाइल में आवश्यक पहुंच फ़ंक्शन प्रदान करें। शेष एप्लिकेशन (विभिन्न फाइलों और दायरे से) * तब * एक्सेस फ़ंक्शंस का उपयोग करने के लिए * होगा। आमतौर पर एक क्लीनर डिजाइन और डीबग और बनाए रखने के लिए आसान होता है। – Chimera

2

file1.c और file2.c

+0

मैंने पहले ही ऐसा किया है जैसा मैंने लिखा था ... ... file3.h कहा जाता है (जो, ज़ाहिर है, file1.c file2.c में और file3.c में शामिल किया गया है) " –

+0

क्षमा करें प्रतीत हो सकता है लेकिन 'अपडेट' करता है और 'get' में फ़ंक्शन के अंदर 'int myvariable' है? यदि आप नहीं प्राप्त कर सकते हैं और कोड अपडेट कर सकते हैं। – keety

+0

शून्य अपडेट (शून्य) {myvariable ++; } int get (void) {वापसी myvariable;} –

2

मैं कोड अव्यवस्था की वजह से extern चर से बचने के लिए सलाह देते हैं में file3.h शामिल हैं। static बनाकर वैश्विक चर को कुछ फ़ाइल दायरे में बांधना आम तौर पर बेहतर होता है। और फिर इसे एक्सेस करने के लिए interface फ़ंक्शंस का उपयोग करने के लिए। आपके उदाहरण शब्दों में यह होगा:

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

बकवास। 'बाहरी' परिवर्तनीय घोषणा 'file3.h' में ठीक से संबंधित है, जो आपके विधि के साथ भी शामिल होगी, जो एक्सेस नियंत्रण के बारे में है। कोड अव्यवस्था यहां मुद्दा नहीं है। – kittemon

+1

मेरी विधि 'बाहरी' चर का खुलासा नहीं करती है - इसे पढ़ने/लिखने के लिए केवल दो कार्य। कभी-कभी यह भी अच्छा दृष्टिकोण है। –

+0

0x69 - यह मेरे लिए काम नहीं करता है। अगर मैं file1.c में इस अद्यतन (5) का आह्वान करता हूं और फिर वहां मुद्रित होता है - यह 5 प्रिंट करेगा। लेकिन उसके बाद जब मैं file2.c से get() प्राप्त करता हूं और इसे प्रिंट करता हूं तो 0 मुद्रित होता है और 5 जैसा मैं चाहता हूं। –

2

यहां केवल एक संभावित समाधान है। ऐसा करने से वेरिएबल पूरे एप्लिकेशन पर वैश्विक नहीं है और केवल एक्सेस फ़ंक्शंस का उपयोग करने के लिए पढ़ा/लिखा जा सकता है। यदि आपके कोई प्रश्न हैं तो कृपया मुझे बताएं।

फ़ाइलें: access.c access.h file2.c main.c
संकलित साथ: gcc main.c file2.c access.c -o test
रन: ./test

फ़ाइल: 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); 
} 

फ़ाइल: access.c

#include "access.h" 

static int variable = 0; 


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

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

फ़ाइल: करें 2 .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); 
} 

फ़ाइल:

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

मुझे आशा है कि इस मदद करता है: access.h

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

और यहाँ रन उत्पादन होता है।

संबंधित मुद्दे