2009-07-12 29 views
54

मुझे लगता है मैं अंधा जा रहा हूँ, क्योंकि मैं समझ नहीं सकता है, जहां सिंटेक्स त्रुटि इस कोड में है: सिंटेक्स त्रुटि:क्या मैं उद्देश्य-सी स्विच स्टेटमेंट के अंदर चर घोषित कर सकता हूं?

if(cell == nil) { 
    titledCell = [ [ [ TitledCell alloc ] initWithFrame:CGRectZero 
     reuseIdentifier:CellIdentifier ] autorelease 
    ]; 

    switch(cellNumber) { 
     case 1: 
      NSString *viewDataKey = @"Name"; 
etc... 

जब मैंने इसे संकलित करने के लिए प्रयास करते हैं, मैं एक त्रुटि हो रही है अंतिम पंक्ति पर '*' टोकन से पहले।

ऐसे मूल प्रश्न के लिए खेद है, लेकिन मुझे क्या याद आ रही है?

+1

cellNumber चर किस तरह का है? स्विच स्टेटमेंट सी से है, इसलिए उद्देश्य-सी प्रकारों का उपयोग करके इसे यात्रा कर सकते हैं। –

+1

सी केवल 'स्विच/केस' के लिए अभिन्न-जैसी ऑब्जेक्ट्स का समर्थन करता है, और यदि मैं यहां समस्या थी तो मुझे एक अलग त्रुटि संदेश की उम्मीद होगी। – ephemient

+0

क्या उद्देश्य-सी C99 (और C++) का पालन करता है और आपको कहीं भी चर घोषित करने की अनुमति देता है, या आप केवल ब्लॉक की शुरुआत में ऐसा कर सकते हैं?यदि आप किसी ब्लॉक की शुरुआत में उन्हें घोषित करने के लिए बाध्य हैं, तो आप ''{'' ''' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' मामले के अंत से पहले। –

उत्तर

66

मैं हाथ पर एक उपयुक्त ऑब्जेक्टिव-सी संकलक की जरूरत नहीं है, लेकिन जब तक सी निर्माणों समान हैं:

switch { … } आप एक ब्लॉक-स्तर का दायरा, प्रत्येक case के लिए एक नहीं देता है। दायरे की शुरुआत के अलावा कहीं भी एक चर घोषित करना गैरकानूनी है, और switch के अंदर है विशेष रूप से खतरनाक है क्योंकि इसकी प्रारंभिकता को खत्म कर दिया जा सकता है।

क्या इनमें से कोई भी समस्या हल करता है?

NSString *viewDataKey; 
switch (cellNumber) { 
    case 1: 
     viewDataKey = @"Name"; 
    … 
} 

switch (cellNumber) { 
    case 1: { 
     NSString *viewDataKey = @"Name"; 
     … 
    } 
    … 
} 
+2

wrt/'दायरे की शुरुआत के अलावा कहीं भी एक चर घोषित करना अवैध है। यह सी 99 में सच नहीं है। सी 99 दोनों इसके लिए अनुमति देता है और इस बात के अर्थशास्त्र को परिभाषित करता है कि "जब एक घोषणा से पहले नियंत्रण कूदता है" और ऐसे मामलों में उस घोषणा का मूल्य क्या होता है। – johne

+0

मैं यह इंगित करना भूल गया कि किस विकल्प ने समस्या हल की है, ओह। मैंने समस्या को हल करने के लिए शीर्ष का उपयोग किया - मुझे नहीं लगता कि मैंने दूसरे सुझाव का परीक्षण किया है, जो बहुत बुरा है, क्योंकि आप लोग देखते हैं कि आप एक महान चर्चा कर रहे थे! – JoBu1324

+0

http://stackoverflow.com/questions/1231198 –

1

क्या यह स्विच ब्लॉक के भीतर एक चर घोषित करने के लिए मान्य नहीं हो सकता है?

+0

जैसा कि मैंने चक के उत्तर पर टिप्पणी की थी: 'स्विच (0) {int i; } 'मान्य सी 8 9 है, और उद्देश्य-सी सी (सी ++ के विपरीत) का एक वास्तविक सुपरसेट है, इसलिए सी (मॉड्यूलो चोरी पहचानकर्ता) में कानूनी सब कुछ उद्देश्य-सी में कानूनी है। – ephemient

20

आप केस स्टेटमेंट की शुरुआत में एक चर घोषित नहीं कर सकते हैं। एक परीक्षण केस बनाएं जिसमें केवल यही शामिल है और आपको एक ही त्रुटि मिल जाएगी।

ब्लॉक के बीच में घोषित चर के साथ ऐसा करने की ज़रूरत नहीं है - यहां तक ​​कि एक मानक अपनाना जो अनुमति देता है कि जीसीसी एक केस स्टेटमेंट की शुरुआत में घोषणा स्वीकार नहीं करेगा। ऐसा लगता है कि जीसीसी लाइन के हिस्से के रूप में केस लेबल को देखता है और इस प्रकार वहां एक घोषणा की अनुमति नहीं देगा।

मामला की शुरुआत में अर्धविराम लगाने के लिए एक साधारण कामकाज सिर्फ इसलिए शुरूआत में नहीं है।

+1

गलत में इन कामों के बारे में अधिक जानकारी क्यों गलत है। 'स्विच (0) {int i; } 'सी 8 9 में भी वापस ठीक से संकलित करता है। – ephemient

+0

गलत नहीं है। मैंने अभी तक जीसीसी के माध्यम से एग्रॉर्न की पोस्ट से अपना उदाहरण चलाया और एक ही त्रुटि मिली। – Chuck

+0

मैं दावा कर रहा हूं कि "केस स्टेटमेंट में एक चर घोषित नहीं कर सकता" गलत है। जीसीसी को मेरी पिछली टिप्पणी में छोटे उदाहरण देने का प्रयास करें। – ephemient

4

सी में आप केवल किसी भी गैर-घोषित बयान से पहले ब्लॉक की शुरुआत में चर घोषित कर सकते हैं।

{ 
    /* you can declare variables here */ 

    /* block statements */ 

    /* You can't declare variables here */ 
} 

सी ++ में आप वेरिएबल्स घोषित कर सकते हैं जहां आपको उनकी आवश्यकता है।

+0

'स्विच (1) {केस 0: int i = 1; टूटना; डिफ़ॉल्ट:/* wtf मैं है? * /; } 'यहां तक ​​कि यदि आप हर जगह चर बदल सकते हैं, तो' स्विच' के अंदर * खतरनाक * है। – ephemient

+0

दृश्य स्टूडियो 2008 के साथ एक सी फाइल संकलित। है -> त्रुटि C2143: वाक्यविन्यास त्रुटि: गायब ';' 'टाइप' =) – Aragorn

+0

सी ++ में प्रारंभकर्ताओं पर छोड़ना सी से भी अधिक खतरनाक है, और एमएसवीसी सी संकलक की तुलना में सी ++ कंपाइलर से अधिक है। मुझे आश्चर्य नहीं है कि यह इस कबाड़ को पसंद नहीं करता है। – ephemient

0

चेतावनी हल करने के लिए कैसे: अपने मामले ब्लॉक की पहली पंक्ति में

1.Insert एक ;

2.Put कोड अंदर धनुकोष्ठक

1

आप एक स्विच बयान के भीतर एक चर बना सकते हैं लेकिन आपको इसे एक ब्लॉक के भीतर बनाना होगा ताकि उस चर के दायरे को परिभाषित किया जा सके।

उदाहरण:

switch(number){ 

    case 1: 
     { 
      // Create object here 
      // object is defined only for the scope of this block 
     } 
     break; 
    case 2: 
     { 
      // etc. 
     } 
     break; 
    default: 
     break; 

} 
+0

यह एक स्वीकार्य उत्तर के साथ एक बहुत पुराने प्रश्न का एक नया जवाब है। आपका जवाब क्या प्रदान करता है कि दूसरों को नहीं? – JAL

+0

यह स्वीकार्य उत्तर में प्रस्तुत किए गए पहले स्विच स्टेटमेंट का विकल्प था। पोस्टिंग के समय मैंने प्रदान किए गए दूसरे स्विच स्टेटमेंट में केस स्टेटमेंट के साथ ब्रैकेट इनलाइन नहीं देखी थी। – egarlock

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