2011-01-13 21 views
8

मैं एक लूप बनाने की कोशिश कर रहा हूं जो नेटवर्क पैकेट की लंबाई के आधार पर पुनरावृत्त होगा। एपीआई में event.packet-> डेटा लम्बाई द्वारा एक चर (size_t) मौजूद है। मैं 0 से eventpacket-> डेटा लम्बाई - 7 को हर बार 10 से बढ़ाना चाहता हूं, लेकिन यह हर बार परेशानी की दुनिया में है।एक size_t को एक पूर्णांक में परिवर्तित करना (सी ++)

मैंने समाधान की तलाश की लेकिन कुछ उपयोगी खोजने में असमर्थ रहे। मैंने size_t को एक हस्ताक्षरित int में परिवर्तित करने और इसके साथ अंकगणित करने की कोशिश की लेकिन दुर्भाग्यवश यह काम नहीं किया। मूल रूप से सभी मैं चाहता हूँ यह है:

हर बार हालांकि
for (int i = 0; i < event.packet->dataLength - 7; i+=10) { } 

मैं अपने रूपांतरण पर इस या प्रयास की तरह कुछ करना मैं < # भाग एक बड़ी संख्या है। उन्होंने एपीआई के लिए एक ट्यूटोरियल में एक प्रिंटफ स्टेटमेंट दिया जो वास्तविक संख्या को मुद्रित करने के लिए "% u" का उपयोग करता था, हालांकि जब मैं इसे एक हस्ताक्षरित int में परिवर्तित करता हूं तो यह अभी भी गलत है। मुझे यकीन नहीं है कि यहां से कहाँ जाना है। किसी भी मदद की सराहना की जाएगी :)

+3

इसके बारे में सोचें: 'static_cast (- 1)' का मूल्य क्या है? क्या होता है जब 'event.packet-> डेटा लम्बाई' 7 से कम है? – genpfault

+0

मैं 'size_t' क्यों नहीं हो सकता? इसके अलावा, जब तक कि लंबाई हमेशा 7 mod 10 के बराबर न हो, यह प्रयास करने के लिए एक बहुत ही असाधारण पाश है। – OrangeDog

+0

क्या आपने 'event.packet-> डेटा लम्बाई' को 'int' पर कास्ट करने का प्रयास किया था? – Dawson

उत्तर

4

आप i के प्रकार को क्यों नहीं बदलते?

for (size_t i = 0; i < event.packet->dataLength - 7; i+=10) { } 

एक ही प्रकार के साथ उपयोग किए जाने वाले सभी चर के प्रकारों को रखने की कोशिश करें; जानवरों से बचा जाना चाहिए।

सी ++ 03 में size_t के लिए कोई प्रारूप विनिर्देश नहीं है, तो आपको सबसे बड़े हस्ताक्षरित पूर्णांक प्रकार को डालना होगा और प्रिंट करना होगा। (सी ++ 0x में size_t के लिए प्रारूप विनिर्देश %zu है)। हालांकि, अगर आप printf वैसे भी नहीं का उपयोग करना चाहिए: धाराओं अधिक वर्बोज़ हो सकता है

std::cout << i; // print i, even if it's a size_t 

है, वे अधिक प्रकार सुरक्षित कर रहे हैं और कुछ भी याद करने के लिए आप की आवश्यकता नहीं है।

ध्यान रखें कि आपका वास्तविक पाश तर्क दोषपूर्ण हो सकता है। (क्या होता है, genpfault नोट्स के रूप में, जब dataLength - 7 नकारात्मक है?)

+0

'डेटा लम्बाई - 7' नकारात्मक होने पर यह मदद नहीं करेगा, और मुझे नहीं लगता कि यह कोई अच्छा काम करेगा। –

+0

@ डेविड: नहीं, यह नहीं होगा, इसलिए मैंने इसका उल्लेख किया। कहना मुश्किल है कि इरादे जानने के बिना क्या तय है। – GManNickG

+0

मैंने कोशिश की कि मैं size_t पहले ही काम नहीं कर रहा हूं। – JeanOTF

1

डेटा लम्बाई> = 7 है? यदि डेटा लम्बाई -7 का परिणाम नकारात्मक है, यदि आप इसे बिना हस्ताक्षर के रूप में समझते हैं, तो परिणाम एक बहुत बड़ा पूर्णांक है।

0

i के लिए size_t का उपयोग करें।

printf के लिए, यदि आपके पास C99 नहीं है, केवल C90 है, तो लंबे समय तक हस्ताक्षर किए गए हैं, या लंबे समय तक हस्ताक्षरित नहीं हैं। उदा .:

for (size_t i = 0; i < 10; ++i) 
     //printf("%llu\n", (unsigned long long)i); 
     printf("%lu\n", (unsigned long)i); 

अन्यथा% zu

0

का उपयोग आप पहले अगर event.packet->dataLength < 7 जांच होनी चाहिए। अब यदि यह 7 से कम है तो आपको 0 से कम मूल्यों को बिना हस्ताक्षरित के रूप में उपयोग किया जाता है: उदा। 0 = 0x00000000; -1 = 0 - 1 = 0xFFFFFFFF।

फिर, जांच:

if (event.packet->dataLength < 7) { 
    ... 
} else { 
    for (size_t i = 0; i < event.packet->dataLength - 7; i+=10) { } 
} 
2

पर हस्ताक्षर किए गणित के साथ सब कुछ करते हैं। प्रयास करें:

for (int i = 0; i < int(event.packet->dataLength) - 7; i+=10) { } 

एक बार जब आप मूल्यों है कि नकारात्मक हो सकता है के साथ अहस्ताक्षरित अंकगणित का प्रयोग कर, और < तरह तुलना ऑपरेटर्स का उपयोग शुरू करते हैं, आप मुसीबत में हैं। चीजों को हस्ताक्षर रखने के लिए बहुत आसान है।

+0

एचएम, मुझे मानक-गारंटीकृत व्यवहार के मामले में पूरी तरह से सोचने के लिए, मेरी मूल टिप्पणी को हटाना पड़ा। दो की पूरक मशीन पर, गैर-प्रतिकूल कंपाइलर के साथ, i.e. * अभ्यास में *, उपर्युक्त काम करेगा। लेकिन संभावित रूप से बड़े हस्ताक्षरित मूल्य का 'int' का रूपांतरण औपचारिक रूप से यूबी है। तो, सर्वोत्तम संश्लेषण ठीक करें। चीयर्स, –

+0

@ एएलएफ पी। स्टीनबाच: धन्यवाद - आपकी टिप्पणी के बाद भी मुझे यह समझने में एक पल लगा कि आपका क्या मतलब है, इसलिए यह सिर्फ एक टाइपो नहीं था। –

0

"हर बार जब मैं ऐसा कुछ करता हूं या अपने रूपांतरणों पर प्रयास करता हूं तो मैं < # भाग एक बड़ी संख्या है।"

यह इंगित करता है कि मूल पैकेट लंबाई 7 से कम है (आप 7 घटा रहे हैं)।

एक फिक्स इन-प्रैक्टिस-बड़े-पर्याप्त हस्ताक्षरित पूर्णांक प्रकार का उपयोग करना है, और मानक लाइब्रेरी उस उद्देश्य के लिए ptrdiff_t प्रदान करती है। की तरह,

#include <stdlib.h> // Not sure, but I think it was this one. 

typedef ptrdiff_t Size; 
typedef Size   Index; 

void foo() 
{ 
    // ... 
    for(Index i = 0; i < Size(event.packet->dataLength) - 7; i += 10) 
    { 
     // ... 
    } 
} 

एक अधिक बोझिल वैकल्पिक हल एक if कि जाँच करता है कि आकार में कम से कम 7

चीयर्स है में पूरी बात एम्बेड करने के लिए है & hth।,

0

event.packet->dataLength के बाद से एक अहस्ताक्षरित रिटर्न टाइप करें size_t:

1) size_t का उपयोग इंडेक्स वैरिएबल प्रकार के रूप में करें।

2) बीमा गणित अंतर्निहित नहीं है। @beldazevent.packet->dataLength से 7 घटाएं, 7 से i जोड़ें।

// for (int i = 0; i < event.packet->dataLength - 7; i+=10) { } 
for (size_t i = 0; i + 7 < event.packet->dataLength; i += 10) { } 
संबंधित मुद्दे