التلاعب الصفيف الديناميكي
-
22-09-2019 - |
سؤال
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] خاطئ ، لكنني أعتقد أنني قرأت أن هذا يجب أن يزيل خلية الصفيف.
ماذا ستكون الطريقة الصحيحة لإزالة خلية الصفيف؟ هل يعتمد على نوع الكائن؟ (سلسلة مقابل الرقم مقابل الكائن)
أو
هل يمكن للمرء معالجة القيمة العلوية لجعلها تعمل؟
أي بعد إزالة البند 3 ، أريد أن يكون الجزء العلوي ، أو الطول ، لأن هذا صحيح منطقيا.
المحلول
بالنسبة إلى المصفوفات المتغيرة بالحجم المتغير ، يتم تخصيص الذاكرة للمصفوفة عند تعيين قيم لها. إرجاع أعلى قيمة تم تعريفها للمصفوفة في البرنامج النصي الحالي. ومع ذلك ، يمكنك القيام بالخدعة باستخدام مجموعة ديناميكية أخرى.
string array2[]
int i
for i = 1 to UpperBound(array[]) - 1
array2[i] = array[i]
next
array = array2
ثم سيتم تخفيض أعلى (صفيف []) بمقدار 1.
سيعمل هذا في Apperbound (Array []) - 1> 2 لأن PowerBuilder يخصص بحجم الذاكرة الافتراضي لعناصر 3 عناصر عند إعلان صفيف ديناميكي.
نصائح أخرى
PowerBuilder ليس لديه حقًا أي وظائف معالجة جيدة الصفيف مدمجة (التي أعرفها).
يمكنك تحقيق ما تحاول القيام به من خلال نسخ القيم التي تريد الاحتفاظ بها إلى صفيف جديد غير محدود.
علي سبيل المثال
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
عندما كنت أكتب تعليقًا على إجابة دان ، بدأت أفكر في ما أستخدمه ، لأنني لا أحب قوائم PFC. ما أستخدمه هو مخزن بيانات ، والذي ، إذا فكرت في الأمر بالطريقة الصحيحة ، يشبه قائمة المنشطات.
بدلاً من نسخ المصفوفة ، إذا كنت بحاجة إلى تتبع الحد الأعلى المتغير للمصفوفة (على سبيل المثال ، إذا كنت تحاول استخدامه كشيء مثل المكدس) ، فلماذا لا تحتفظ بمتغير عدد صحيح منفصل فقط يشير إلى آخر حقيقي فهرس العنصر؟ يبدو أبسط بكثير وأكثر كفاءة من حلول النسخ المقترحة أعلاه!