Memset

2013-10-31 5 views
6

काम नहीं कर रहा कोड का निम्न भाग का उपयोग कर एक शुद्ध 2 डी सरणी पर memset उपयोग करने के लिए कोशिश कर रहा हूँ,:Memset

:

#include <iostream> 
#include <cstring> 

using namespace std; 

int main() 
{ 
    int l[3][3]; 
    memset (l, 1, sizeof(l)); 
    for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      cout << l[i][j] << " "; 
     } 
     cout << endl; 
    } 
    return 0; 
} 

मैं लाइन का उपयोग पूरे सरणी 1 से प्रारंभ करना चाहते हैं स्मृति (एल, 1, आकार (एल));

लेकिन मैं उम्मीद मूल्य नहीं मिलता है, यह मेरे निम्नलिखित उत्पादन देता है:

16843009 16843009 16843009 
16843009 16843009 16843009 
16843009 16843009 16843009 

सोचा कि यह एक संकलक समस्या हो सकती है, इसलिए मैं Ideone उपयोग करने की कोशिश:

http://ideone.com/VFYUDg

कृपया मदद करें। बाइट्स पर

उत्तर

17

memset काम करता है, तो यह 0x01010101 मूल्यों (यह मानते हुए पूर्णांक 32 बिट है), जो दशमलव 16843009.

है आप एक साथ एक 2-आयामी सी शैली सरणी को भरने के लिए की जरूरत है साथ ints के अपने सरणी भरता है संख्या:

int l[3][3]; 
std::fill_n(*l, sizeof l/sizeof **l, 1); 

*l यहाँ सरणी (int*) के पहले तत्व के लिए सूचक में int[3][3] decays, sizeof l/sizeof **l सरणी तत्वों की गिनती अर्जित करता है।

यह सी ++ आवश्यकता का उपयोग करता है कि सरणी को बिना किसी अंतराल के स्मृति में संयोजित रूप से रखा जाना चाहिए, ताकि बहु-आयामी सरणी में एकल-आयामी वाले समान लेआउट हो। जैसे int [3][3] में int[3 * 3] के समान लेआउट है।

और memset के विपरीत, std::fill_n बाइट्स पर नहीं, ऑब्जेक्ट स्तर पर चलता है। अंतर्निर्मित प्रकारों के लिए अनुकूलित संस्करण सामान्यतः सिम निर्देशों के रूप में रेखांकित करता है, memset से कम कुशल नहीं।

+0

इसलिए यदि मैं पूर्ण सरणी को पूर्णांक मान 1 या 2 कहने के साथ प्रारंभ करना चाहता हूं, तो मुझे क्या उपयोग करना चाहिए? – shivshnkr

+0

@ user123456 'std :: fill' या' std :: fill_n' का उपयोग करें। –

4

वास्तव में, यह बहुत अच्छी तरह से काम ...

168430090x01010101 (हेक्स) के दशमलव प्रतिनिधित्व है।

memset ने अपना काम सही किया, यानी यह प्रदत्त स्मृति क्षेत्र में प्रत्येक बाइट को 0x01 पर प्रारंभ किया गया।

+0

तो मेरी सरणी को 0 के अलावा एक पूर्णांक मान में प्रारंभ करने के लिए मेमसेट का उपयोग कैसे करें? – shivshnkr

+0

@ user123456 'memset' __always__ बाइट आधार पर काम करेगा। इस प्रकार आप केवल एक आवधिक बाइट पैटर्न के साथ अपनी सरणी शुरू करने में सक्षम होंगे। – Rerito

-2

अपने उद्देश्य 1 के लिए सरणी के प्रत्येक आइटम स्थापित करने के लिए फिर निम्न अपने काम करेगा है, तो

पूर्णांक एल [3] [3] = {1,1,1,1,1,1 , 1,1,1};

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