2010-03-29 21 views
7
string array[] 
long lBound, uBound 

lBound = LowerBound(array[]) // = 1, empty array value 
uBound = UpperBound(array[]) // = 0, empty array value 

array[1] = 'Item 1' 
array[2] = 'Item 2' 
array[3] = 'Item 3' 

lBound = LowerBound(array[]) // = 1 
uBound = UpperBound(array[]) // = 3 

array[3] = '' //removing item 3 

lBound = LowerBound(array[]) // = 1, still 
uBound = UpperBound(array[]) // = 3, still (but array[3] is nulled? 

मुझे लगता है कि लाइन 'सरणी [3]' गलत है, लेकिन मुझे लगता है कि मैंने पढ़ा है कि इसे सरणी कक्ष को हटा देना चाहिए।पावरबिल्डर गतिशील ऐरे मैनिपुलेशन

एक सरणी कक्ष को हटाने का सही तरीका क्या होगा? क्या यह ऑब्जेक्ट प्रकार पर निर्भर करता है? (स्ट्रिंग बनाम संख्या वस्तु बनाम)

या

एक यह काम करने के लिए UpperBound मूल्य में हेरफेर कर सकते हैं?

यानी आइटम 3 को हटाने के बाद, मैं ऊपरीबाउंड, या सरलीकृत, 2 होना चाहता हूं, क्योंकि यह तर्कसंगत रूप से सही है।

+1

वैसे, लोअरबाउंड हमेशा परिवर्तनीय-आकार सरणी के साथ 1 लौटाएगा। लोअरबाउंड का उपयोग तब किया जाता है जब आप 'स्ट्रिंग फू [-7 से 34]' जैसी सरणी घोषित करते हैं। इस सरणी के लिए लोअरबाउंड रिटर्न -7। –

उत्तर

8

For variable-size arrays, memory is allocated for the array when you assign values to it. UpperBound returns the largest value that has been defined for the array in the current script। हालांकि, आप एक और गतिशील सरणी का उपयोग कर चाल कर सकते हैं।

string array2[] 
int i 

for i = 1 to UpperBound(array[]) - 1 
    array2[i] = array[i] 
next 

array = array2 

फिर UpperBound (सरणी []) द्वारा 1.

यह कम हो जाएगा UpperBound (सरणी []) के लिए काम करेंगे - क्योंकि PowerBuilder 3 घटकों के लिए डिफ़ॉल्ट स्मृति आकार के द्वारा आवंटित 1> 2 जब एक गतिशील सरणी घोषित की जाती है।

+0

श्वास, मैंने सोचा कि मुझे ऐसा कुछ करना होगा। धन्यवाद gd047 – glasnt

3

पावरबिल्डर में वास्तव में कोई अच्छा सरणी हेरफेर फ़ंक्शन नहीं है (जिसे मैं जानता हूं)।

आप उन मूल्यों की प्रतिलिपि बनाकर जो करने की कोशिश कर रहे हैं, उसे प्राप्त कर सकते हैं, जिसे आप एक नई असंबद्ध सरणी में रखना चाहते हैं।

उदाहरण

int i 
string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[] 

for i = 1 to 2 
    array2[i] = array3[i] 
next 
UpperBound(array2[]) // = 2 

अपने उदाहरण में आप केवल नवीनतम मूल्य हटा रहे हैं के लिए

- यह और भी अधिक बस इतना की तरह एक नई छोटी, घिरा सरणी के लिए पूरे सरणी को कॉपी करके किया जा सकता है:

string array3[] = {'Item 1', 'Item 2', 'Item 3'}, array2[2] 

array2 = array3 
UpperBound(array2[]) // = 2 
0

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

+0

मुख्य कारण: यह गलती करने के लिए एक और जगह है। तो अपने आप को बचाने के लिए, आप किसी ऑब्जेक्ट में सरणी को लपेटते हैं और बहुत जल्द आपने एक सूची लागू की है। सूचियों के लिए सभी तरह के समर्थन के साथ जावा जैसी भाषा में, आप बहुत अच्छी तरह से एक ArrayList की तरह चुन सकते हैं। पीएफसी में सूची समर्थन है, लेकिन मुझे हमेशा लगा है कि कार्यान्वयन घबराहट था और मैंने कभी इसका इस्तेमाल नहीं किया है। –

+0

मेरी विंडोज़ और उपयोगकर्ता ऑब्जेक्ट्स के बीच सरणी के दायरे के कारण, 1 आइटम को दायरे में रखने की कोशिश करना आसान है, फिर एक अलग चर के बारे में चिंता करने की ज़रूरत है जो पहले व्युत्पन्न है। – glasnt

2

जब मैं दान के उत्तर के लिए एक टिप्पणी लिख रहा था तो मैंने जो भी उपयोग किया, उसके बारे में सोचना शुरू कर दिया, क्योंकि मुझे पीएफसी की सूचियां पसंद नहीं हैं। मैं जो डेटा उपयोग करता हूं वह डेटास्टोर है, जो, यदि आप इसके बारे में सही तरीके से सोचते हैं, तो स्टेरॉयड पर एक सूची की तरह है।

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