Массив в структуре
От: SilverEye  
Дата: 15.05.06 17:51
Оценка:
Имею структуру:

    public struct PlayerCalculationData
    {
        public float[] temperatureData;
    }


Надо заполнить массив в структуре и записать её в виде массива байтов в файл.

Пытаюсь привести её к массиву байтов:

        protected static unsafe byte[] DataStructToBytes(PlayerCalculationData info)
        {
            byte[] arr = new byte[sizeof(PlayerCalculationData)];
            fixed (byte* parr = arr)
            { *((PlayerCalculationData*)parr) = info; }
            return arr;
        }



При этом компилятор ругается на строку с
 byte[] arr = new byte[sizeof(PlayerCalculationData)];
, сообщая, что

Сannot take the address of, get the size of, or declare a pointer to a managed type ('TermalDrawPlayer.PlayerCalculationData')

Вопрос: как правильно работать со структурами в unmanaged-коде, чтобы не возникало таких ошибок? Надо узнать размер структуры после выделения памяти под массив и его заполнения.
Спасибо заранее.
Re: Массив в структуре
От: Mab Россия http://shade.msu.ru/~mab
Дата: 15.05.06 18:37
Оценка:
Здравствуйте, SilverEye, Вы писали:

Marshal.SizeOf
Re[2]: Массив в структуре
От: SilverEye  
Дата: 15.05.06 19:23
Оценка:
Здравствуйте, Mab, Вы писали:

Mab>Здравствуйте, SilverEye, Вы писали:


Mab>Marshal.SizeOf


Когда пишу
byte[] arr = new byte[Marshal.SizeOf(PlayerCalculationData)];

выскакивает ошибка
'TermalDrawPlayer.PlayerCalculationData' is a 'type' but is used like a 'variable'

Хотя, как я понимаю, SizeOf есть как с аргументом типа object, так и с типом Type. Почему не работает в таком случае с object?
Правильным будет записать так?
byte[] arr = new byte[Marshal.SizeOf(typeof(PlayerCalculationData))];
Re[3]: Массив в структуре
От: SilverEye  
Дата: 15.05.06 19:27
Оценка:
И ещё вопрос: можно ли сделать как-нибудь эту структуру не managed-типа? Чтобы спокойно работать с ней с помощью указателей в unsafe-коде?
Re: Массив в структуре
От: WolfHound  
Дата: 15.05.06 19:56
Оценка:
Здравствуйте, SilverEye, Вы писали:

А зачем тебе вобще unsafe понадобился?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Массив в структуре
От: SilverEye  
Дата: 15.05.06 20:05
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, SilverEye, Вы писали:


WH>А зачем тебе вобще unsafe понадобился?


Мне надо записывать вышеуказанную структуру с массивом внутри в файл, перед этим сжимая. Использую SharpZipLib. Для запись в поток ZipOutputStream требуется массив типа byte[], поэтому стоит задача конвертации моей структуры managed-типа в байтовый массив.
Нашёл на одном форуме англоязычном вот такое решение проблемы:
http://www.dotnet247.com/247reference/msgs/18/91438.aspx
Только в том случае структура содержала только переменные, но не содержала массивов. А массив воспринимается компилятором как managed-тип, поэтому оказывается невозможно создать на него указатель и привести его к указателю на массив байтов. (Как определить размер я уже разобрался.)
Ошибка появляется в следующем коде:
        protected static unsafe byte[] InfoStructToBytes(PlayerCalculationData info)
        {
            byte[] arr = new byte[Marshal.SizeOf(info)];
            fixed (byte* parr = arr)
            { *((PlayerCalculationData*)parr) = info; }
            return arr;
        }
, на строке

            { *((PlayerCalculationData*)parr) = info; }
.
Компилятор не может привести unmanaged-тип указателя на byte к managed-типу PlayerCalculationData.
Re[3]: Массив в структуре
От: WolfHound  
Дата: 15.05.06 20:16
Оценка:
Здравствуйте, SilverEye, Вы писали:

SE>Мне надо записывать вышеуказанную структуру с массивом внутри в файл, перед этим сжимая. Использую SharpZipLib. Для запись в поток ZipOutputStream требуется массив типа byte[], поэтому стоит задача конвертации моей структуры managed-типа в байтовый массив.

Блин сколько раз говорили людям говорить чето вам действительно надо...
Ненужен тут никакой unsafe.
Смотри BinaryWriter, а еще лучше не изобретай велосипедов используй сериализацию. См BinaryFormatter.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Массив в структуре
От: SilverEye  
Дата: 15.05.06 20:55
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, SilverEye, Вы писали:


SE>>Мне надо записывать вышеуказанную структуру с массивом внутри в файл, перед этим сжимая. Использую SharpZipLib. Для запись в поток ZipOutputStream требуется массив типа byte[], поэтому стоит задача конвертации моей структуры managed-типа в байтовый массив.

WH>Блин сколько раз говорили людям говорить чето вам действительно надо...
WH>Ненужен тут никакой unsafe.
WH>Смотри BinaryWriter, а еще лучше не изобретай велосипедов используй сериализацию. См BinaryFormatter.
Спасибо.
Тогда у меня несколько вопросов по сериализации. Объясню, что я хочу получить.
Мне нужен архив, внутри которого будет находиться много файлов, каждый из которых — результат расчётов в некоторый момент времени. Также отдельным файлом в этом архиве лежит файл настроек.
Я сначала хотел перегруженным методом Write(...) класса ZipOutputStream, наследника от Stream, писать в файл архива результаты расчёта, по одному, по мере поступления результатов из программы. Результатов много и каждый из них считается достаточно долго, поэтому последовательная запись в файл оправдана (расчёт теоретически может проводиться и несколько дней).
Теперь, используя Serialize(...) из BinaryFormatter смогу ли я записывать в файл архива данные в виде отдельных файлов? Как работает Serialize(...) с потоками? Т.е. при каждом вызове он фактически заменяет метод Write(...) класса потока?
Re[5]: Массив в структуре
От: WolfHound  
Дата: 15.05.06 21:13
Оценка:
Здравствуйте, SilverEye, Вы писали:

SE>Теперь, используя Serialize(...) из BinaryFormatter смогу ли я записывать в файл архива данные в виде отдельных файлов? Как работает Serialize(...) с потоками? Т.е. при каждом вызове он фактически заменяет метод Write(...) класса потока?

Он пишет данные используя метод Write того потока который в него передали.
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: Массив в структуре
От: SilverEye  
Дата: 15.05.06 21:50
Оценка:
Здравствуйте, WolfHound, Вы писали:

WH>Здравствуйте, SilverEye, Вы писали:


SE>>Теперь, используя Serialize(...) из BinaryFormatter смогу ли я записывать в файл архива данные в виде отдельных файлов? Как работает Serialize(...) с потоками? Т.е. при каждом вызове он фактически заменяет метод Write(...) класса потока?

WH>Он пишет данные используя метод Write того потока который в него передали.
Спасибо за помощь! Сейчас попробую реализовать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.