2009-06-24 11 views
9

का उपयोग करते हुए इस कोड है कि मैं लिखने की कोशिश करना चाहते हैं:सी: memset समारोह

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#include <malloc.h> 

int main(int argc, char *argv[]) 
{ 
    float arry[3] = {0}; 

    memset(arry, (int) 10.0, 3*sizeof(float)); 

    return 0; 
} 

मेरे समस्या यह है कि मैं देखना चाहता हूँ अगर यह एक सरणी के हर प्रवेश करने के लिए memset उपयोग करना संभव है 0 से अधिक की संख्या। हालांकि, उस पंक्ति के माध्यम से कदम उठाने के बाद, सरणी सामग्री बहुत छोटी संख्या (0) में बदल जाती है। मुझे आश्चर्य है कि मैं इस मामले में memset() फ़ंक्शन का उपयोग कर गलत कर रहा हूं। मुझे उम्मीद है कि यह एक डुप्लिकेट पोस्ट नहीं है, क्योंकि सुझाए गए प्रश्नों में से कोई भी ऐसा नहीं है जैसा कि मैं टाइप कर रहा हूं।

उत्तर

9

एक इंट के लिए डबल कास्टिंग सिर्फ द्विआधारी संख्या 00001010 (बाइनरी में 10) बनाता है, और यह वह मान है जो यादृच्छिक है। चूंकि यह एक char है, इसलिए आपकी प्रत्येक फ्लोट वास्तव में बिट पैटर्न 00001010 00001010 00001010 00001010 प्राप्त कर रही है।

+0

यानी यह केवल सरणी की प्रविष्टियों को शून्य करने के लिए इसका उपयोग करने के लिए समझ में आता है, व्यावहारिक रूप से बोल रहा है? – stanigator

+0

या यदि आप एक चार सरणी स्थापित कर रहे हैं जिसमें कुछ अन्य मान प्रासंगिक है। –

+0

या कोई भी बाइट मान। सबसे आम शायद 0 है, लेकिन 0xFF भी बहुत उपयोग किया जा सकता है। स्पष्टीकरण के लिए –

7

नहीं मेमसेट एक बाइट लेता है और इसे सरणी में लिखता है। एक फ्लोट एक बहु-बाइट प्रकार है।

संपादित करें: हाँ, मुझे पता है कि मेमसेट एक int लेता है। लेकिन यह भरने के लिए केवल एक हस्ताक्षरित चार (एक बाइट) का उपयोग करता है।

15

Memset एक int लेता है, लेकिन इसे एक हस्ताक्षरित चार में रखता है, और फिर फ्लोट के प्रत्येक बाइट को भरता है (आकार (फ्लोट) शायद 4) उस बिट पैटर्न के साथ। इस C++ है, तो fill बजाय पसंद करते हैं:

#include <algorithm> 
using namespace std; 

//... 

fill (arry,arry+3,10.0); 
+0

महान सुझाव। मैं इसका इस्तेमाल करूँगा। – stanigator

+1

और यदि आप सी ++ में नहीं हैं, तो प्लेटफ़ॉर्म-विशिष्ट मेमसेट वेरिएंट देखें जो एक सिंगल से बड़े पैटर्न लिखते हैं। उदाहरण के लिए memset_pattern4 है यदि आपके पास है। या सिम निर्देश। –

2

वास्तव में अपने प्रयास एक छोटा सा भ्रामक है, memset बाइट्स पर काम करता है .. वास्तव में memset मूल्य के लिए एक नाव का उपयोग कर किसी भी मतलब नहीं है!

फ्लोट प्रारूप में मंटिसा के लिए 23 + 1 बिट्स और एक्सपोनेंट के लिए 8 बिट्स हैं .. जब आप फ्लोट के अंदर कच्चे बाइट मान (मेमसेट का उपयोग करके) लिखते हैं तो आप नहीं जानते कि आप क्या प्राप्त कर रहे हैं क्योंकि आप मूल्य निर्धारित कर रहे हैं एक अलग तरीके से व्याख्या की जाएगी!

अपने स्निपेट में आप इसे 4-बाइट्स फ्लोट को 4-बाइट्स फ्लोरेट में बदलकर 4-बाइट्स इंटीजर में 10 10 युक्त होते हैं, लेकिन जैसा कि पहले कहा जाता है कि अगर आप 10 (= 0x0a) के साथ फ्लोट को याद करते हैं) आप 0x0A0A0A0A प्राप्त करना समाप्त कर देंगे जो फ्लोट प्रारूप में 10.0f नहीं है, यह भी हो सकता है (यह भी आपके मामले में 0 के करीब कुछ भी हो सकता है)।

असल memset उपयोगी होता है जब आप वर्ण की एक सरणी प्रारंभ करने में (जब से तुम हर चार के लिए प्रभावी ढंग से कि मान प्राप्त क्योंकि वे 1 बाइट लंबे होते हैं) या कि काम करता है जब आप 0 (शून्य) के लिए सब कुछ सेट करना चाहते हैं चाहते हैं प्रत्येक मूल प्रकार के डेटा के लिए ..

3

क्यों न केवल एक साधारण for लूप?

+3

गति की आवश्यकता एक उत्तर है। – EvilTeach

+0

वास्तव में मेरे प्रश्न का पूरा बिंदु। – stanigator

+0

सभी मेमसेट करने जा रहे हैं उस समय स्मृति एक बाइट सेट है। एक लूप के लिए एक समय में आकार (arry) बाइट आकार (फ्लोट) बाइट्स के माध्यम से ज़िप होगा। और एक समारोह कॉल के ऊपरी हिस्से के बिना! –

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