2008-09-08 14 views
8

आकार नहीं जानते हैं तो आप 2 आयामी सरणी कैसे प्रारंभ करते हैं मेरे पास एक दो आयामी सरणी है जिसे मुझे डेटा लोड करने की आवश्यकता है। मुझे डेटा की चौड़ाई (22 मान) पता है, लेकिन मुझे ऊंचाई नहीं पता (लगभग 4000 रिकॉर्ड अनुमानित, लेकिन परिवर्तनीय)।जब आप

मैं इसे घोषित इस प्रकार है:

float[,] _calibrationSet; 
    .... 
int calibrationRow = 0; 
While (recordsToRead) 
{ 
    for (int i = 0; i < SensorCount; i++) 
    { 
    _calibrationSet[calibrationRow, i] = calibrationArrayView.ReadFloat(); 
    } 
    calibrationRow++; 
} 

यह एक NullReferenceException का कारण बनता है, इसलिए जब मैं इस तरह यह प्रारंभ करने का प्रयास करें:

_calibrationSet = new float[,]; 

मैं एक "सरणी निर्माण सरणी आकार होना आवश्यक है या सरणी प्रारंभकर्ता। "

धन्यवाद, कीथ

उत्तर

8

आप एक सरणी का उपयोग नहीं कर सकते हैं। या इसके बजाय, आपको एक आकार चुनना होगा, और यदि आप अधिक की आवश्यकता समाप्त कर देते हैं तो आपको एक नया, बड़ा, सरणी आवंटित करना होगा, पुराने डेटा को नए से डेटा में कॉपी करना होगा, और पहले जैसा जारी रखना होगा (जब तक आप नए के आकार से अधिक न हो ...)

आम तौर पर, आप संग्रह कक्षाओं में से एक के साथ जाएंगे - ArrayList, सूची <>, लिंक्डलिस्ट <>, आदि - जो आप पर निर्भर करता है की तलाश में है; लिस्ट लिस्ट <> लगातार पुनः आवंटन की समस्या से बचने के लिए सूची (धीमी पहुंच और अधिक मेमोरी उपयोग की लागत पर) से बचने के लिए सूची आपको सबसे पहले बताई गई चीज़ों की सबसे नज़दीकी चीज़ देगी।

उदाहरण:

List<float[]> _calibrationSet = new List<float[]>(); 

// ... 

while (recordsToRead) 
{ 
    float[] record = new float[SensorCount]; 
    for (int i = 0; i < SensorCount; i++) 
    { 
     record[i] = calibrationArrayView.ReadFloat(); 
    } 
    _calibrationSet.Add(record); 
} 

// access later: _calibrationSet[record][sensor] 

ओह, और यह, कि मैं यहाँ क्या कर रहा हूँ आप एक एकल, बहु-आयामी सरणी के रूप में ही स्मृति संरचना नहीं देता है ध्यान देने योग्य है (Grauenwolf किया था) होगा - हुड के तहत, यह वास्तव में डेटा रखने वाले अन्य सरणी के संदर्भों की एक श्रृंखला है। यह सरणी को पुनर्विक्रय सस्ता बनाकर एक अच्छा सौदा बनाने के लिए गति करता है, लेकिन पहुंच गति (और, ज़ाहिर है, स्मृति उपयोग) पर इसका असर हो सकता है। चाहे यह आपके लिए एक मुद्दा है, इस पर निर्भर करता है कि आप लोड होने के बाद डेटा के साथ क्या कर रहे हैं ... और क्या दो सौ रिकॉर्ड या दो मिलियन रिकॉर्ड हैं।

2

आप .NET में एक सरणी नहीं बना सकते हैं (इसके संदर्भ में घोषित करने के विपरीत, जो आपने अपने उदाहरण में किया है) बिना किसी स्पष्ट रूप से, या स्पष्ट रूप से शाब्दिक मूल्यों का एक सेट निर्दिष्ट करके जब आप इसे शुरू करते हैं। (उदाहरण के लिए int [,] array4 = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};)

आपको पहले एक चर-आकार डेटा संरचना का उपयोग करने की आवश्यकता है (22-तत्व 1-डी सरणी की एक सामान्य सूची सबसे सरल होगी) और उसके बाद अपना सरणी आवंटित करें और अपना डेटा समाप्त होने के बाद अपने डेटा को कॉपी करें और आपको पता चले कि आपको कितनी पंक्तियां चाहिए।

0

मैं आम तौर पर इस प्रकार के काम (सूची, ऐरेलिस्ट आदि) के लिए निकर संग्रह का उपयोग करता हूं और फिर (यदि वास्तव में आवश्यक हो) टी [,] को पूरा किया जाता है।

0

आपको या तो सरणी को अधिकतम आकार (फ्लोट [99 9, 22]) में आवंटित करने की आवश्यकता होगी, या एक अलग डेटा संरचना का उपयोग करें।

मैं लगता है कि आप कॉपी/मक्खी पर आकार परिवर्तन कर सकता है .. (लेकिन मैं नहीं लगता है कि आप करना चाहते हैं करते हैं)

मैं सूची उचित लगता है लगता है।

1

मैं सिर्फ एक सूची का उपयोग करता हूं, फिर उस सूची को एक सरणी में रूपांतरित करता हूं।

आप यहां देखेंगे कि मैंने स्क्वायर सरणी (फ्लोट []] के बजाय एक जंजीर सरणी (फ्लोट [] []) का उपयोग किया था। चीजों को करने का "मानक" तरीका होने के अलावा, यह बहुत तेज होना चाहिए। किसी सूची से किसी सरणी में डेटा को कनवर्ट करते समय आपको केवल [calibrationRow] पॉइंटर्स कॉपी करना होगा। एक वर्ग सरणी का उपयोग करके, आपको [calibrationRow] x [सेंसरकाउंट] फ्लोट की प्रतिलिपि बनाना होगा।

 var tempCalibrationSet = new List<float[]>(); 
     const int SensorCount = 22; 
     int calibrationRow = 0; 

     while (recordsToRead()) 
     { 
      tempCalibrationSet[calibrationRow] = new float[SensorCount]; 

      for (int i = 0; i < SensorCount; i++) 
      { 
       tempCalibrationSet[calibrationRow][i] = calibrationArrayView.ReadFloat(); 
      } calibrationRow++; 
     } 

     float[][] _calibrationSet = tempCalibrationSet.ToArray(); 
0

तुम भी एक दो आयामी ArrayList (System.Collections से) इस्तेमाल कर सकते हैं - आप एक ArrayList बनाने के लिए, फिर उसके अंदर एक और ArrayList डाल दिया। यह आपको गतिशील आकार देने की आवश्यकता होगी, लेकिन थोड़ी सी ओवरहेड की कीमत पर।

+0

ओवरहेड का एक उचित बिट, असल में: ऐरेलिस्ट() फ्लोट को बॉक्स करेगा, जो धीमा और स्मृति गहन होगा ... –

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