2012-05-09 21 views
6

मेरे पास एक विशाल 3-आयामी सरणी है जो मेरी दुनिया का प्रतिनिधित्व करती है। यह स्थिर प्रारंभ करने में बहुत बड़ा है:मुझे इस बहु-आयामी सरणी को कैसे प्रारंभ करना चाहिए?

alias Cell[128][128][128] World; // <-- The compiler points to this line 

Error: index 128 overflow for static array 

मैं World* world लेकिन यह अभी भी ऊपर त्रुटियां अतिप्रवाह के साथ बाहर उपयोग करने की कोशिश। तो क्या मैं अभी इस बदसूरत गड़बड़ है:

alias Cell[][][] World; 
// ... 
private World world; 
// ... 
world.length = WORLD_XDIM; 
for (uint x = 0; x < world.length; ++x) 
{ 
    world[x].length = WORLD_YDIM; 
    for (uint y = 0; y < world[x].length; ++y) 
    { 
     world[x][y].length = WORLD_ZDIM; 
    } 
} 

काम करता है यही कारण है कि है, लेकिन यह मेरे अंदर पर एक छोटे से रोना आता है। क्या कॉलोक के परिणाम को 3-आयामी सरणी में डालने का कोई तरीका है? मैंने इसे नियमित सरणी slicing के साथ किया है, लेकिन 3-डी चीज मुझे परेशान कर रहा है।

+1

यह 666 वां प्रश्न है [डी] के साथ टैग किया गया है। हम्म। – nmichaels

+0

और यह मेरे पसंदीदा डी विषय, बहु-आयामी सरणी की परिभाषा/प्रारंभिकरण के बारे में है। मुझे अभी भी अर्थशास्त्र नहीं मिला है। – sleeplessnerd

उत्तर

9

यदि आप एक जंजीर सरणी घोषित करना चाहते हैं (यानी जहां प्रत्येक उप-सरणी में भिन्न लंबाई हो सकती है), तो आपको एक लूप का उपयोग करने की आवश्यकता है जैसे कि आप कर रहे हैं, लेकिन यह वर्दी सरणी के लिए अनावश्यक है।

auto arr = new Cell[][][](128, 128, 128); 

जब आप कोष्ठक के बीच के अंक डाल, तो आप कर रहे हैं यह स्थिर सरणियों के एक गतिशील सरणी बनाने: आप इस तरीके एक बहु-आयामी सरणी जो दांतेदार नहीं है प्रारंभ है। तो,

auto arr = new Cell[128][128][128]; 

मुझे लगता है कि यह उपयोगी हो सकता है अगर आप वास्तव में है कि (मैं कभी नहीं है जो) करने के लिए की जरूरत लंबाई 128 के स्थिर सरणियों की लंबाई 128 की एक स्थिर सरणियों के एक गतिशील सरणी वाणी है, लेकिन यह निश्चित रूप से नियमित आधार पर नए शौक की यात्रा करता है।

व्यक्तिगत रूप से, इस तरह के मुद्दों को पूरी तरह से बचने के लिए, मैं सिर्फ कोष्ठक के बीच में संख्या डाल कभी नहीं, तब भी जब एक भी आयाम सरणी की घोषणा:

auto arr = new Cell[](128); 

मैं तथ्य यह है कि पर कोष्ठक के बीच नंबर डाल पाते हैं पहले आयाम को एक गतिशील सरणी के रूप में माना जाता है जबकि किसी भी आगे के स्तरों को संख्याओं को एक स्थिर सरणी के रूप में माना जाता है, जो कि खराब डिजाइन विकल्प होता है, और मुझे नहीं पता कि यह वही तरीका क्यों है, लेकिन यही तरीका है कि यह है । मैं समझ सकता हूं कि स्थैतिक सरणी के गतिशील सरणी बनाने में सक्षम होना चाहते हैं, लेकिन यह new Cell[128] को अस्वीकार करने या इसे 12812 के Cell[] की बजाय Cell[128]* वापस करने के लिए कहीं अधिक संगत होता, लेकिन दुर्भाग्य से, यह नहीं है कि यह कैसे काम करता है ।

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