Michel PERRIN Ответов: 0

Как вычислить длину записи массива структуры


У меня есть следующая структура:
Public Structure Aliment
              Public Alino As Integer
              <VBFixedString(83)> Public NomUS As String
              <VBFixedString(50)> Public NomFR As String
              <VBFixedString(24)> Public Categ As String
              Public Paramali() As Double
        End Structure

Тогда у меня есть массив этой структуры

Общественные TousALI() В Качестве Алиментов

Массив Paramali () переопределяется:

Оператор Redim Сохранить TousALI.Параман(80)

Данные, хранящиеся в массиве TousALI, поступают из файла .txt.
Я загружаю его, отображаю в datagridview, и он отлично работает.

Но теперь я хочу сохранить данные в файле произвольного доступа:

FileOpen(1, FileAliRand, OpenMode. Random, OpenAccess.Напишите,, 813)

Но следующая строка :
FilePut(1, TousALI(I)) выдает мне ошибку: Неправильная длина записи.

длина записи 813 - это общее количество байтов.

Как вычислить фактическое количество байтов моего массива ?

Спасибо за помощь

Что я уже пробовал:

Я пробовал много разных длин, но это не работает

NightWizzard

Ну, я не знаю, как вы пришли к общей длине 813? Если вы подсчитаете количество байтов в памяти, целое число займет 2 байта, а каждое двойное число - 8 байтов. В приведенном выше примере это даст в общей сложности 829 байтов в памяти: 640 для 80 двойных, 2 для int и для каждой строки ее длина плюс 10 байтов накладных расходов. Если вы пишете двоичный файл, длина записи должна быть 829. Если вы пишете текстовый файл, числовые параметры должны быть преобразованы в строку - в этом случае длина строки для каждого числового значения может отличаться. Например: для установки Integer на 1000 по-прежнему требуется 2 байта в памяти для Integer, но строка будет иметь длину 4 плюс 10 байт служебных данных = 14 !!
В VB.NET вы также можете попробовать использовать либо свойство length:
размер = алимент.Длина
или этот метод:
Маршал.Оператор Sizeof(П.)
Надеюсь, это поможет вам решить проблему - удачи!

Richard MacCutchan

Целые числа занимают 4 байта, или 8 в 64-битном режиме.

NightWizzard

Спасибо, Ричард , ты прав. Я перепутал это со старым VB6/VBA - может быть, я делаю эту работу слишком много лет. Для Мишеля здесь ссылка на то .Объем данных обобщить:
https://msdn.microsoft.com/en-us/library/s3f49ktz.aspx

Maciej Los

Если вы используете VB.NET, вы должны использовать BinaryFormater вместо метода FileOpen и т. д.

0 Ответов