Todiruta Costel Nicusor Ответов: 1

Как я могу использовать параметр типа struct из структуры


Привет,
Я объявил параметр типа struct в структуре, и когда я пытаюсь использовать этот параметр из структуры, я получаю ошибку NullReferencePointer.

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

Кроме того, я знаю, что вы не можете инициализировать структуру в структуре.
Есть ли способ использовать этот параметр без получения этой ошибки?

[StructLayout(LayoutKind.Sequential)]
public struct TCommandParam
{
    public int iValue;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)]
    public byte[] sValue;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] FrameFD;

}

[StructLayout(LayoutKind.Sequential)]
public struct TCommandBuffer
{
    public int Command;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public TCommandParam[] Param;
    public int ReturnValue;
}

OriginalGriff

Не видя кода, мы не можем помочь-struct s являются типами значений и не имеют нулевого значения (то есть только для ссылочных типов), поэтому то, что вы описываете, не является тем, что происходит, если только вы не объявили его как тип nullable.
Разместите соответствующие фрагменты кода и покажите нам, где происходит ошибка.
Используйте виджет" улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Todiruta Costel Nicusor

Я обновил свой вопрос

1 Ответов

Рейтинг:
9

OriginalGriff

Хорошо - Проблема не в структуре, а в содержимом структуры.
Массив чего - либо в .NET является ссылочным типом, даже если это массив struct (или любой тип значения, такой как int или byte), и если вы не инициализируете ссылочный тип, вы получаете ошибку нулевой ссылки при попытке его использовать.
В ваших структурах у вас есть три массива: sValue, FrameFD и Param, ни один из которых вы не показываете инициализированным. Имейте в виду, что атрибут MarshalAs действует только тогда, когда вы начинаете передавать информацию в неуправляемый код: если вы не назначите экземпляр массива ни одному из этих массивов, вы получите ошибку нулевой ссылки всякий раз, когда попытаетесь их использовать.
Поэтому начните с того, где вы создаете экземпляры структур, и посмотрите, выделяете ли вы пространство массива для них всех.
"только создайте экземпляр структуры TCommandBuffer, также я не выделяю для них пространство массива. Я попытался создать конструктор внутри структуры и выделить размер массива, но это не сработало. Как я могу выделить пространство массива для всех из них, чтобы я мог использовать эти параметры структуры?"

Я бы настоятельно рекомендовал вам использовать классы a вместо структур, отчасти потому, что вы можете предоставить инициализаторы (что запрещено делать структурам), а также конструкторы без параметров:

[StructLayout(LayoutKind.Sequential)]
public sealed class TCommandParam
    {
    public int iValue;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4096)]
    public byte[] sValue = new Byte[4096];
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 64)]
    public byte[] FrameFD = new byte[64];

    }

[StructLayout(LayoutKind.Sequential)]
public sealed class TCommandBuffer
    {
    public int Command;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public TCommandParam[] Param = new TCommandParam[10];
    public int ReturnValue;
    public TCommandBuffer()
        {
        for (int i = 0; i < Param.Length; i++)
            {
            Param[i] = new TCommandParam();
            }
        }
    }
В любом случае иметь большие структуры-плохая идея; это действительно может плохо повлиять на производительность: Использование структуры и класса - что это такое?[^]- Рекомендации MS заключаются в том, что структуры не должны превышать 16 байт, и ваш TCommandParam делает это, если вы компилируете для 64-битной среды, так как ссылка составляет 8 байт.


Todiruta Costel Nicusor

Я только создаю экземпляр структуры TCommandBuffer, а также не выделяю для них пространство массива. Я попытался создать конструктор внутри структуры и выделить размер массива, но это не сработало. Как я могу выделить пространство массива для всех из них, чтобы я мог использовать эти параметры структуры?

OriginalGriff

Ответ обновлен.