2016-05-14 5 views
15

असाइन करता हूं, तो मैं एक शुरुआती सी प्रोग्रामर हूं, कल मैंने सी structs का उपयोग सीखा और इन लोगों के संभावित अनुप्रयोग के संकल्प के बारे में सीखा विशिष्ट समस्याएं हालांकि जब मैं सी प्रोग्रामिंग के इस पहलू को जानने के लिए अपने सी आईडीई (कोडब्लॉक 16.01) के साथ प्रयोग कर रहा था, तो मुझे एक अजीब समस्या का सामना करना पड़ा। कोड निम्नलिखित है:"त्रुटि: सरणी प्रकार त्रुटि के साथ अभिव्यक्ति के लिए असाइनमेंट" जब मैं एक स्ट्रक्चर फ़ील्ड (सी)

#include <stdio.h> 

#define N 30 

typedef struct{ 
    char name[N]; 
    char surname[N]; 
    int age; 
} data; 

int main() { 
    data s1; 
    s1.name="Paolo"; 
    s1.surname = "Rossi"; 
    s1.age = 19; 
    getchar(); 
    return 0; 
} 

संकलन के दौरान, संकलक (जीसीसी 4.9.3-1 Windows के तहत) मेरे एक त्रुटि है कि कहते हैं

"error: assignment to expression with array type error"

अनुदेश को सूचना दी

s1.name="Paolo" 
s1.surname="Rossi" 

जबकि अगर मैं

data s1 = {"Paolo", "Rossi", 19}; 

यह काम करता है। मैं क्या गलत कर रहा हूँ?

+6

आपने असाइनमेंट और प्रारंभिकरण के बीच अंतरों में से एक खोज लिया है। –

+1

क्या आप अधिक विशिष्ट हो सकते हैं? धन्यवाद;) – Chief096

+0

आप 's1 = (कॉन्स्ट डेटा) {" पाओलो "," रॉसी ", 1 9} लिख सकते हैं;' –

उत्तर

23

आप

s1.name="Paolo"; 

में इस मुद्दे का सामना करना पड़, क्योंकि एलएचएस में, आप एक सरणी प्रकार है, जो आबंटित नहीं है का उपयोग कर रहे होते हैं।

C11 से विस्तार से बता दें, अध्याय §6.5.16

assignment operator shall have a modifiable lvalue as its left operand.

और, परिवर्तनीय lvalue के बारे में, अध्याय से §6.3.2.1

A modifiable lvalue is an lvalue that does not have array type, [...]

आप को strcpy() उपयोग करने की आवश्यकता सरणी में कॉपी करें।

उस ने कहा, data s1 = {"Paolo", "Rossi", 19}; ठीक काम करता है, क्योंकि यह प्रत्यक्ष असाइनमेंट असाइनमेंट ऑपरेटर शामिल नहीं है। ऑब्जेक्ट के आरंभिक मान प्रदान करने के लिए हम ब्रेस-संलग्न प्रारंभकर्ता सूची का उपयोग कर रहे हैं। के रूप में अध्याय में उल्लेख किया है कि, आरंभीकरण की व्यवस्था इस प्रकार §6.7.9

Each brace-enclosed initializer list has an associated current object. When no designations are present, subobjects of the current object are initialized in order according to the type of the current object: array elements in increasing subscript order, structure members in declaration order, and the first named member of a union.[....]

+1

यदि मैं 'char * b =" हैलो "हूं, और यदि मेरे पास' char c [] है = "हैलो" ', दोनों काम करता है, अगर पहले मामले के लिए मैं' b = "helloworld" करता हूं, तो यह भी काम करता है, लेकिन दूसरे मामले के लिए यदि मैं 'c =" helloworld "करता हूं, तो ऐसा क्यों नहीं होता? –

+0

@ सूरजजैन जो जवाब में समझाया गया है। आप एक सरणी को असाइन नहीं कर सकते हैं। –

+1

वह तेज़ था। –

5

इस उदाहरण यहाँ की जाँच करें:

: Accessing Structure Members

वहाँ से समझाया गया है कि सही तरीके से यह करने के लिए इस तरह है

strcpy(s1.name , "Egzona"); 
printf("Name : %s\n", s1.name); 
+0

इसमें एक अतिरिक्त फ़ंक्शन कॉल ओवरहेड है (जो कंपाइलर इनलाइन करने के लिए चुन सकते हैं लेकिन आमतौर पर नहीं करते हैं), जो इनलाइन की बजाय लूप करता है, और यदि आप जिस मशीन पर संकलित कर रहे हैं, तो यह लूप समाप्त नहीं हो सकता है चले जाओ, यह हमेशा कम से कम एक पुनरावृत्ति करता है। ऐसा लगता है कि इसे स्रोत कोड को प्रीप्रोकैस किए बिना हल नहीं किया जा सकता है क्योंकि सी आपके लिए यह नहीं करेगा। 'char x [2] = {'h', 0}; * (char (*) [2]) और x = * (char (*) [2]) और x; '' ccpy (x, x, 2) 'से काफी तेज़ होना चाहिए, यदि यह मान्य सी था। – Dmitry

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