Как в RunTime изменить размер массива структур

jkrnd

Как во время выполнения изменить размер массива структур? Внутри стуктуры как один из членов, содержится массив.
Public Structure ArchRecord 
        Public lTime As Int32
        <VBFixedArray(7)> Public sng() As Single 
   End Structure
   Public arrRec() As ArchRecord
'.........
' Redim arrRec(55) '- не работает
Array.Resize (arrRec, 55) '- не работает
при попытке обратиться к arrRec(0).lTime, например, - всё без проблем, а если попытаться реализовать следующее:
arrRec(0).sng(0) = CSng(5.55)
компилятор говорит "Ссылка на объект не указывает на экземпляр объекта." все члены массива (члена структуры) имеют значение Nothing
6 ответов

jkrnd

не работает
Все работает. "Вы просто не умеете их готовить" (с)


jkrnd

Да, команда ReDim arrRec(0).sng(0) всё исправляет. Но! количество инициализируемых arrRec (размер массива структур) достигает 120 000 и в каждой из них по массиву из восьми sng. Неужели я должен дать команду Redim 120 000 * 8 раз? Присвоить значение - согласен. Но изменять размер массива столько раз... Неужели другого ничего не придумать. Из отправленного Вами кода (на картинке) закоментируйте строку ReDim arrRec(0).sng(0) и получите мою проблему.


jkrnd

Неужели я должен дать команду Redim 120 000 * 8 раз?
Да. Это же разные массивы.


jkrnd

Из отправленного Вами кода (на картинке) закоментируйте строку ReDim arrRec(0).sng(0) и получите мою проблему.
Зачем закомментировать, чтобы получить проблему? Там все правильно.
Неужели я должен дать команду Redim 120 000 * 8 раз
Нет, только 120 000


jkrnd

Спасибо за подсказку. Всё понял. И всё-таки странно почему нельзя при переопределении размера массива структур автоматом забить всю отведённую для этого новую память нулями (проинициализировать). Для одиночных членов структуры почему-то инициализация производится автоматом, а для включённых в структуру массивов нужно об этом позаботиться самому. Как у Хазанова: "Инженера' не доглядели" или я чего-то не догоняю? Ещё раз спасибо.


jkrnd

jkrnd, в документации всё сказано. Использование VBFixedArrayAttribute не освобождает от необходимости выделять память.
The VBFixedArrayAttribute is informational and does not allocate any storage. The purpose of this attribute is to modify how arrays in structures and non-local variables are used by methods or API calls that recognize the VBFixedArrayAttribute. Keep in mind that this attribute does not convert a variable length array to a fixed array and that you must still allocate array storage using Dim or ReDim statements.