Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C#<>C++] struct - переделать на C#, Нужна помощь в переводе кода с C++ на C# 
V
    Опции темы
MuForum
Дата 2.8.2008, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Доброе время суток.
- Необходима помощь по переводу кода с C++ на C#.

Код

#pragma pack(1)
struct PMSG_HEAD2
{
        BYTE Type;
        BYTE hSize;
        BYTE lSize;
        BYTE Head;
        BYTE SubHead;
};
struct MSG_ServerInfo
{
    WORD Id;
    BYTE Load;
    BYTE End;
};
struct PMSG_ServersSend
{
        PMSG_HEAD2 Head;
        BYTE hCount;
        BYTE lCount;
        MSG_ServerInfo Servers[MAX_SERVERS];
};
#pragma pack()


Я перевел следующим образом:
Код

        [StructLayout(LayoutKind.Sequential, Pack = 1)]
        unsafe struct PMSG_HEAD2
        {
            public byte Type; // 1 byte;
            public byte hSize; // 1 byte;
            public byte lSize; // 1 byte;
            public byte Head; // 1 byte;
            public byte SubHead; // 1 byte;
        }
        unsafe struct MSG_ServerInfo
        {
            public ushort Id; // 2 bytes;
            public byte Load; // 1 byte;
            public byte End; // 1 byte;
        }
        unsafe struct PMSG_ServersSend
        {
            public PMSG_HEAD2 Head;
            public byte hCount; // 1 byte;
            public byte lCount; // 1 byte;
            public MSG_ServerInfo Servers; // Вот тут проблема, не знаю как реализовать. (Пробовал делать через List<>, но тогда не получается обращаться к элементам)
        }


- Пока решить не могу =((

Это сообщение отредактировал(а) MuForum - 2.8.2008, 10:13


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Necias
Дата 2.8.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 7.4.2006

Репутация: 2
Всего: 2



Массив фиксированного размера в структуре можно объявить так
Код

using System.Runtime.InteropServices;
///..........///
[StructLayout(LayoutKind.Explicit)]
    public struct struct1
    {
        [FieldOffset(0)]
        public byte a;
        [FieldOffset(1)]
        public int b;    
        [FieldOffset(5)]
        public short c;
        [FieldOffset(7)]
        public byte buffer;   //массив с 10 элементами
        [FieldOffset(18)]
        public byte d;  
    }

доступ к элементам массива получать посредством указателей в небезопасном коде

Добавлено @ 11:46
виноват, туплю. Начиная с С# 2.0
Код

unsafe struct struct1
    {
        public int header;
        public fixed int values[10];
    }

PS использовать такой буффер можно тоже лишь в небезопасной секции кода

Это сообщение отредактировал(а) Necias - 2.8.2008, 11:48
PM MAIL ICQ   Вверх
MuForum
Дата 2.8.2008, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

Репутация: нет
Всего: 4



Цитата(Necias)

...
Код

unsafe struct struct1
    {
        public int header;
        public fixed int values[10];
    }

PS использовать такой буффер можно тоже лишь в небезопасной секции кода

То что доктор прописал, спасибо!

Это сообщение отредактировал(а) MuForum - 31.3.2009, 23:39


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Necias
Дата 2.8.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 45
Регистрация: 7.4.2006

Репутация: 2
Всего: 2



1. Можно разбить MSG_ServerInfo на базовые типы (понимаю, скверно)
2. Можно сделать инициализацию в конструкторе
Код

    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    unsafe struct PMSG_HEAD2
    {
        public byte Type; // 1 byte;
        public byte hSize; // 1 byte;
        public byte lSize; // 1 byte;
        public byte Head; // 1 byte;
        public byte SubHead; // 1 byte;
    }
    public unsafe struct MSG_ServerInfo
    {
        public ushort Id; // 2 bytes;
        public byte Load; // 1 byte;
        public byte End; // 1 byte;
    }
    public unsafe struct struct1
    {
        public struct1(int size) // параметр size - фиктивный
        //чтобы проинициализировать надо сделать вызов struct1 d = new struct1(0);
        //таким образом логика приложения нарушается меньше, чем при варианте ручной
        //инициализации массива
        {
            Data = new MSG_ServerInfo[254];
        }

        public MSG_ServerInfo[] Data;
    }

3. все таки массив инициировать вручную
К сожалению, больше никаких возможностей спецификация C# 2.0 не предоставляет
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0737 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.