Сутність масивів у Visual Basic

Гергерт Сергій Сутність масивів у Visual Basic

Звертаю увагу на одну прикру річ. Не вдасться оголосити функцію, яка приймає масив будь-якого типу. Тому доведеться кожному типу використовуваних даних писати свою функцію: ArrayExitsLong, ArrayExitsVariant, ArrayExitsMyUserType і т.д. Шаблонів немає у нас з вами, і перевантаження теж :) Але буде змінюватися тільки назва функції і тип параметра - тіло функції залишається незмінним. Ніхаласо? Хочемо все-таки універсальність? Гаразд, але тоді функція буде

А викликати її тоді потрібно не "flag = ArrayExists (arrName)", а "flag = ArrayExists (ArrPtr (arrName))". Але я тут скрізь оперуватиму масивами Long, гаразд? :) Продовжимо. Займемося тепер. Ну припустимо. створенням масивів із загальними даними. Зробимо так: є як би головний масив, і є два інші, які в ньому повністю містяться. Цікаво, навіщо це потрібне? :) Ну а раптом знадобиться :). Оголосимо ще пару функцій:

Коментар до статті

Стаття загалом непогана. Однак, в неї вкралася прикра помилка (наведений у статті приклад без усунення цієї помилки не працюватиме): функція ArrPtr() повертає не покажчик на SAFEARRAY, а покажчик на покажчик на SAFEARRAY. Плюс, мені здається, що працювати використовуючи структуру (тип) SAFEARRAY безсумнівно простіше, ніж описаним у статті способом, тому що при цьому немає потреби використовувати функції SafeArrayAllocDescriptor(), ні SafeArrayDestroyDescriptor(). Достатньо оголосити:

Потім прописати в структурах SA1 і SA2 параметри (другий і четвертий параметри в структурах SAFEARRAY повинні бути встановлені 128 і 0 відповідно, інше придумаєте самі). Після чого прописати на них покажчики:

Замість функцій VarPtr(), ArrPtr() та StrArrPtr() можна використовувати однуз двох (на вибір) наступних універсальних функцій: