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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Struct в С#, нужна помощь 
:(
    Опции темы
Lotus
Дата 17.1.2007, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Привет Всем! У меня вопрос . У меня имееться сруктура на С++ к примеру:
// Card-Acceptor-Name-Loc, field #43
typedef union
    {    
    char   chData[30];                   
    struct CrdAccptNameLoc_t
        {
        char chOwner[22];               
        char chCity[13];                
        char chState[3];                
        char chCountry[2];              
        char chFiller[8];               
        } stCrdAccptNameLoc;            
    struct AFJPMember_t
        {
        char chPrefix[3];               
        char chMemberNumber[12];       
        char chFiller[25];                
        } stAFJPMemberData;               
    } CRDACCPTNAMELOC_ISO, FIELD43; 

как мне периписать его на С#.  Заранее спасибо!!!!!!1



Это сообщение отредактировал(а) Lotus - 17.1.2007, 08:39
PM MAIL   Вверх
vladsch
Дата 17.1.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ну, примерно так. Только сразу несколько оговорок. Так char в шарпе двухбайтовый, я использовал byte. И компиляция требует разрешенного unsafe кода. Собственно, пример:
Код

using System;
using System.Runtime.InteropServices;

namespace ConsoleApplication3
{
    [StructLayout(LayoutKind.Sequential)]
    internal unsafe struct stCrdAccptNameLoc_t
    {
        public fixed byte chOwner[22];
        public fixed byte chCity[13];
        public fixed byte chState[3];
        public fixed byte chCountry[2];
        public fixed byte chFiller[8];
    }

    [StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
    internal unsafe struct AFJPMember_t
    {
        public fixed byte chPrefix[3];
        public fixed byte chMemberNumber[12];
        public fixed byte chFiller[25];
    }


    [StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)]
    internal unsafe struct CardAcceptor
    {
        [FieldOffset(0)] public fixed byte chData [30];

        [FieldOffset(0)] public stCrdAccptNameLoc_t stCrdAccptNameLoc;

        [FieldOffset(0)] public AFJPMember_t stAFJPMemberData;
    }

    internal class Program
    {
        private static void Main(string[] args)
        {
            unsafe
            {
                CardAcceptor field43 = new CardAcceptor();
                for (int i = 0; i < 30; i++)
                {
                    field43.chData[i] = (byte)i;
                }

                for (int i = 0; i < 22; i++)
                {
                    Console.WriteLine(field43.stCrdAccptNameLoc.chOwner[i]);
                }
            }    
        }
    }
}

PM MAIL   Вверх
Lotus
Дата 17.1.2007, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



vladsch, 
Спасибо за помощь!!!! Сейчас я его опробую.... smile 
PM MAIL   Вверх
mr.DUDA
Дата 17.1.2007, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



union можно имитировать одинаковым FieldOffset, но байтовый массив chData нельзя перекрыть со структурой. Ближе всего к этому коду такой вариант:
Код
using System;
using System.Runtime.InteropServices;

using FIELD43 = CRDACCPTNAMELOC_ISO;

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct CrdAccptNameLoc_t
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 22)]
    public char[] chOwner;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 13)]
    public char[] chCity;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
    public char[] chState;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 2)]
    public char[] chCountry;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
    public char[] chFiller;

    public CrdAccptNameLoc_t(bool a)
    {
        chOwner = new char[22];
        chCity = new char[13];
        chState = new char[3];
        chCountry = new char[2];
        chFiller = new char[8];
    }
}

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct AFJPMember_t
{
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 3)]
    public char[] chPrefix;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 12)]
    public char[] chMemberNumber;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 25)]
    public char[] chFiller;
    
    public AFJPMember_t(bool a)
    {
        chPrefix = new char[3];
        chMemberNumber = new char[12];
        chFiller = new char[25];
    }
}

[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct CRDACCPTNAMELOC_ISO
{
    [FieldOffset(0)]
    public CrdAccptNameLoc_t stCrdAccptNameLoc;
    [FieldOffset(0)]
    public AFJPMember_t stAFJPMemberData;

    public CRDACCPTNAMELOC_ISO(bool a)
    {
        stCrdAccptNameLoc = new CrdAccptNameLoc_t(a);
        stAFJPMemberData = new AFJPMember_t(a);
    }
}

class Program
{
    static void Main()
    {
        CRDACCPTNAMELOC_ISO obj = new CRDACCPTNAMELOC_ISO(true);
    }
}


Конструкторы с bool-аргументом здесь присутствуют по следующей причине: поля char[] нужно проинициализировать (иначе там будут null-ы), а сделать это для структуры можно только в конструкторе с параметрами.

FIELD43 объявлен как алиас типа CRDACCPTNAMELOC_ISO.


--------------------
user posted image
PM MAIL WWW   Вверх
Lotus
Дата 17.1.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пробую компильнуть выбивает ошибка Unsafe code may only appear if compiling with /unsafe
в чем может быть проблема? Может что-то в настройках? Я на MVS 2005 только неделю как начал работать, поэтому всех тонкостей знаю, да и летературы маловато, пологаюсь только на свою интуицию...
PM MAIL   Вверх
mr.DUDA
Дата 17.1.2007, 11:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Про fixed не знал, плюс в репу vladsch.

Добавлено @ 11:37 
Цитата(Lotus @  17.1.2007,  10:35 Найти цитируемый пост)
в чем может быть проблема? Может что-то в настройках? Я на MVS 2005 только неделю как начал работать, поэтому всех тонкостей знаю, да и летературы маловато, пологаюсь только на свою интуицию...

В настройках проекта нужно поставить птицу "Allow unsafe code".


--------------------
user posted image
PM MAIL WWW   Вверх
vladsch
Дата 17.1.2007, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



to mr.DUDA:

Почему нельзя перекрыть массив? Этот код работает и видно что данные перекрывается
Пробывал твой код проверить, во время выполнения он вылетает
Вот тест:

CRDACCPTNAMELOC_ISO obj = new CRDACCPTNAMELOC_ISO(true);
        for (int i = 0; i < 22; i++)
        {
            obj.stCrdAccptNameLoc.chOwner[i] = (char) i;
        }

        for (int i = 0; i < 3; i++)
        {
            Console.WriteLine(obj.stAFJPMemberData.chPrefix[i]);
        }
PM MAIL   Вверх
Lotus
Дата 17.1.2007, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA, 
Цитата(mr.DUDA @  17.1.2007,  11:36 Найти цитируемый пост)
В настройках проекта нужно поставить птицу "Allow unsafe code".

Спасибо помогло, теперь работает...

PM MAIL   Вверх
Lotus
Дата 17.1.2007, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



vladsch,  и  
mr.DUDA, 
спасибо за помощь, проблема решена!!!!!!!!!!!!!!!!
PM MAIL   Вверх
mr.DUDA
Дата 17.1.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(vladsch @  17.1.2007,  10:44 Найти цитируемый пост)
Почему нельзя перекрыть массив? Этот код работает и видно что данные перекрывается

У меня при попытке перекрыть структуру и массив вылетает исключение при старте - пишет что-то типа cannot overlap structure and non-object data.

Цитата(vladsch @  17.1.2007,  10:44 Найти цитируемый пост)
Пробывал твой код проверить, во время выполнения он вылетает

Похоже, структуры тоже нельзя перекрывать друг с другом - при инициализации второй структуры, ссылка на массив chPrefix (длина 3) заменяет собой содержимое поля chOwner, поэтому вместо 22 элементов там всего 3.


--------------------
user posted image
PM MAIL WWW   Вверх
Lotus
Дата 18.1.2007, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA, 
Цитата(mr.DUDA @  17.1.2007,  13:52 Найти цитируемый пост)
Похоже, структуры тоже нельзя перекрывать друг с другом - при инициализации второй структуры, ссылка на массив chPrefix (длина 3) заменяет собой содержимое поля chOwner, поэтому вместо 22 элементов там всего 3.

Может в данной ситуации  их лучше вообще не использовать а применять только классы?


Это сообщение отредактировал(а) Lotus - 18.1.2007, 13:44
PM MAIL   Вверх
mr.DUDA
Дата 18.1.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Классы маршалятся по ссылке, поэтому их нельзя передавать в длл на C++, структуры практически всегда используют для передачи в/из обычных длл.


--------------------
user posted image
PM MAIL WWW   Вверх
Lotus
Дата 18.1.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA в таком случаи какой из двух примеров мне выбрать Ваш или  vladsch,  для моей библиотечке?

Это сообщение отредактировал(а) Lotus - 18.1.2007, 15:18
PM MAIL   Вверх
mr.DUDA
Дата 18.1.2007, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Цитата(Lotus @  18.1.2007,  14:14 Найти цитируемый пост)
mr.DUDA в таком случаи какой из двух примеров мне выбрать Ваш или  vladsch,  для моей библиотечке?

Рабочий пример лучше smile. То есть пример от vladsch.


--------------------
user posted image
PM MAIL WWW   Вверх
vladsch
Дата 18.1.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Lotus, а тебе зачем вся эта кухня нужна?
Тебе требуется передавать эту структуру в неуправляемый код
(например, в длл, написанную на плюсах)? Или просто надо было
организовать похожее на шарпе?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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