MC9S12C32 माइक्रोकंट्रोलर के लिए कुछ एम्बेडेड सी कोड में, मेरे पास एक गोलाकार कतार (उर्फ सर्कुलर बफर) है जो एक स्थिर आकार के बाइट सरणी और कतार के पीछे और पीछे के लिए दो "पॉइंटर्स" के साथ लागू होता है, जो वास्तव में कतार के सरणी के लिए सूचकांक हैं।सी हस्ताक्षरित मॉड्यूलस संकलक चेतावनी का कारण बनता है
// call unsigned chars bytes
typedef unsigned char byte;
byte trear = 0; // SCI transmit display buffer IN index
byte tfront = 0; // SCI transmit display buffer OUT index
byte tsize = 16; // size of transmit buffer
byte tbuf[16]= {0};// SCI transmit display buffer
ध्यान दें कि trear
रियर तत्व की वास्तविक सूचकांक है, लेकिन tfront
एक सामने तत्व की वास्तविक सूचकांक (विषय निश्चित रूप से 16 सापेक्ष करने के लिए) से कम है। तो, उदाहरण के लिए, अगर मेरे बफर निहित "हैलो", यह इस प्रकार दिखाई देंगे (जहां खाली स्लॉट हैं कचरा मान):
_________________________________
| | |h|e|l|l|o| | | | | | | | | |
^ ^
front rear
जब यह कतार से एक बाइट दूर करने के लिए समय आ गया है, मैं यह कर:
// increment front index
tfront++;
// wrap front index if it exceeded bounds
tfront %= tsize; // (A)
// get character to transmit
byte outputChar = tbuf[tfront];
यह सब ठीक काम करता है - कम से कम, मेरे कार्यक्रम ने इस खंड से संबंधित कोई भी बग प्रदर्शित नहीं किया है। हालांकि, जब मैं इस कार्यक्रम को संकलित, मेरे संकलक मुझे लाइन के बारे में चेतावनी दी है टुकड़ा में (A)
ऊपर चिह्नित, शिकायत:
के संभावित नुकसानचेतावनी: C2705: डेटा
main.c लाइन 402
लाइन 402 लाइन (ए) है। मुझे ध्यान रखना चाहिए कि मैं जीसीसी या इसी तरह का उपयोग नहीं कर रहा हूं; मैं फ्रीस्केल के कोडवायरियर आईडीई में संकलित हूं, जिसने कभी-कभी मुझे कुछ और रहस्यमय चेतावनियां दी हैं।
// increment front index mod tsize
tfront = (tfront + 1 >= tsize) ? 0 : tfront + 1; // (B)
// get character to transmit
byte outputChar = tbuf[tfront];
लेकिन, मेरा संकलक अब भी वही चेतावनी, लाइन (B)
के बारे में इस समय का उत्सर्जन करता है: चेतावनी से छुटकारा पाने के प्रयास में, मैं के रूप में ऊपर टुकड़ा दुबारा लिखा। शायद संकलक मुझे बता रहा है कि कथन (tfront + 1 >= tsize)
, tfront
निष्पादन से पहले 255 हो सकता है, और अतिप्रवाह। बेशक, मुझे पता है कि यह नहीं होगा, लेकिन मेरा कंपाइलर नहीं करता है।
यदि यह मामला है, तो, क्यों (A)
एक समस्या थी? असल में, मैं जानना चाहता हूं कि कंपाइलर किस बारे में नाखुश है।
मेरे सवाल का पूरा लिखने के बाद से, मैं इसे एक चर प्रकार से tsize
बदलते एक पूर्वप्रक्रमक परिभाषा के द्वारा हल किया गया है (अर्थात, #define TSIZE 16
)। मेरा सवाल अभी भी खड़ा है, यद्यपि।
कुछ संबंधित प्रश्न:
unsigned overflow with modulus operator in C
modulus operator with unsigned chars
ध्यान दें कि tsize' 2 के एक शक्ति होने की गारंटी दी जा सकती है, तो ', यह थोड़ा मुखौटा का उपयोग करने के और अधिक कुशल है, और वह भी बड़े करीने से बचा जाता है एक कलाकार के बिना यह चेतावनी। तो 16 तत्वों के बफर के लिए, 'tfront = = 0x0f'' tfront% = 16' की बजाय। किसी भी 'tsize' के लिए सामान्य मामले में 2 की शक्ति है, आवश्यक मॉड-मास्क 'tsize - 1' है। – Clifford
@Clifford यदि चेतावनी 'lval = expr; 'तक विस्तारित असाइनमेंट के कारण होती है, जहां' lval' टाइप' बाइट' और 'expr' टाइप' int' है, तो थोड़ा मास्क का उपयोग चेतावनी से नहीं बचाता है: ' tfront & = मुखौटा; 'tfront = tfront & mask;' और 'tfront & mask' में 'tfront% size' करता है (C99 6.3.1.1 बंद और 6.3.1.8:1" के कारण' int 'टाइप किया गया है पूर्णांक प्रचार दोनों ऑपरेटरों पर किया जाता है ")। –
@Clifford इसके अतिरिक्त, किसी को bitwise ऑपरेटर को सही करने की आवश्यकता है। क्या आपका मतलब '&' था? –