Маршалинг двумерного массива char фиксированной длины в C ++ в качестве члена структуры

Я пытаюсь вызвать неуправляемую функцию C ++, которая имеет структуру в качестве входного параметра. Структура определяется в заголовочном файле следующим образом:

struct MyStruct
{
int     siOrder;
char     aaszNames[6][25];
int     siId[6];
int     siTones[6];        
};

Я попытался объявить управляемую структуру следующим образом:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct MyStruct {

public int siOrder;

[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst=150)]
public string aaszNames;

[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)]
public int[] siId;

[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=6, ArraySubType=UnmanagedType.I4)]
public int[] siTones;
}

Но безуспешно. Я предполагаю, что маршалинг не удался, так как aaszNames на самом деле является массивом из шести длинных строк, заканчивающихся нулем, по 25. Я пытался объявить aaszNames как

 [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)]
 public char[] aaszNames;

заполнение массива нулями, где это необходимо. Но опять же ничего.

Что-то мне не хватает? Что я не прав? Каков наилучший способ упорядочить этот массив двумерных символов?

Любые подсказки, пожалуйста.

4 голоса | спросил TTheot 15 FebruaryEurope/MoscowbMon, 15 Feb 2010 17:41:40 +0300000000pmMon, 15 Feb 2010 17:41:40 +030010 2010, 17:41:40

4 ответа


0

Попробуйте использовать несколько структур C #:

[StructLayoutAttribute(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
public struct MyStruct_Name
{
    [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 25)]
    public string name;
}

[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct MyStruct
{
    public int siOrder;

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6)]
    public MyStruct_Name aaszNames;

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I4)]
    public int[] siId;

    [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 6, ArraySubType = UnmanagedType.I4)]
    public int[] siTones;
}

Вот так я передавал массивы строк в стиле C.

Не забудьте создать содержимое aaszNames! Маршаллер ненавидит нулевые ссылки.

MyStruct foo = new MyStruct();
for (int i = 0; i < 6; i++)
{
    foo.aaszNames[i] = new MyStruct_Name();
    foo.aaszNames[i].name = "";
}

Удачи!

ответил Michael Miller 22 PM00000070000004731 2011, 19:54:47
0
[MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst=150)]
 public char[] aaszNames;

Этот тип сортировки выглядит хорошо. Возможно проблема в вызове функции или неправильное распределение памяти /

ответил necrostaz 15 FebruaryEurope/MoscowbMon, 15 Feb 2010 18:32:28 +0300000000pmMon, 15 Feb 2010 18:32:28 +030010 2010, 18:32:28
0

Я написал бы небольшую c-программу для проверки размера C-структуры в байтах.
Тогда я хотел бы пойти с другим предложением, чтобы извлечь поле данных по полю.
С точки зрения C /0 обрабатывается как обычный символ, включенный в 6 байтов, тогда как C # будет использовать длину 5 и иметь /0 скрытым.

ответил weismat 16 FebruaryEurope/MoscowbTue, 16 Feb 2010 10:06:19 +0300000000amTue, 16 Feb 2010 10:06:19 +030010 2010, 10:06:19
0
char aaszNames[6][25];

символ типа C ++ равен 8 битам ~

но символ типа C # - это Unicode, (16 бит)!

so char типа C ++ <-> байт типа C #

ответил Joe 15 J0000006Europe/Moscow 2011, 12:48:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132