доступ к двойному указателю - PullRequest
1 голос
/ 18 января 2010

typedef struct _WDF_USB_DEVICE_SELECT_CONFIG_PARAMS {

ULONG Размер;

WdfUsbTargetDeviceSelectConfigType Type;

union {

struct {
  PUSB_CONFIGURATION_DESCRIPTOR  ConfigurationDescriptor;
  PUSB_INTERFACE_DESCRIPTOR*  InterfaceDescriptors;
  ULONG NumInterfaceDescriptors;
} Descriptor;
struct {
  PURB  Urb;
} Urb;
struct {
  UCHAR  NumberConfiguredPipes;
  WDFUSBINTERFACE  ConfiguredUsbInterface;
} SingleInterface;
struct {
  UCHAR  NumberInterfaces;
  PWDF_USB_INTERFACE_SETTING_PAIR  Pairs;
  UCHAR  NumberOfConfiguredInterfaces;
} MultiInterface;

} Типы;

} WDF_USB_DEVICE_SELECT_CONFIG_PARAMS, * PWDF_USB_DEVICE_SELECT_CONFIG_PARAMS;

WDF_USB_DEVICE_SELECT_CONFIG_PARAMS params;

typedef struct _USB_INTERFACE_DESCRIPTOR {

УЧАР ШЛАНГ;

UCHAR bInterfaceClass;

UCHAR bInterfaceSubClass;

} USB_INTERFACE_DESCRIPTOR, * PUSB_INTERFACE_DESCRIPTOR;

Возможность доступа к NumInterfaceDescriptors через -> params.Types.Descriptor.NumInterfaceDescriptors

Я хочу получить доступ к bInterfaceClass через WDF_USB_DEVICE_SELECT_CONFIG_PARAMS. Обратите внимание, что эта структура заполнена библиотекой, мне нужно просто получить к ней доступ

Ответы [ 6 ]

4 голосов
/ 18 января 2010
(*someIntDesc)->iInterface
2 голосов
/ 18 января 2010
IntDesc foo;
// somehow initialize foo to actually point to (a pointer to) a valid structure
(*foo)->iInterface = 10;
1 голос
/ 18 января 2010

Из названия InterfaceDescriptors может показаться, что он указывает на массив указателей на структуру. Таким образом, более идиоматический способ будет:

InterfaceDescriptors[0]->iInterface = 10;
1 голос
/ 18 января 2010

IntDesc - это тип, а не переменная. Поэтому первое, что вам нужно сделать, это создать переменную правильного типа:

IntDesc id;

Далее, вам нужно указать его на выделенную память. Я собираюсь положить все в стек, у вас могут быть другие потребности:

USB_INTERFACE_DESCRIPTOR usb;
PUSB_INTERFACE_DESCRIPTOR pusb = &usb;
id = &pusb;

Теперь, когда у вас есть действительный указатель, вы можете разыменовать его. Поскольку это двойной указатель, вам нужно будет разыменовать его дважды:

(*(*id)).iInterface = 10;

Поскольку C определяет -> как комбинацию * и ., вы можете выразить это более кратко с помощью:

(*id)->iInterface = 10; 
0 голосов
/ 18 января 2010

Ваш код неверный

NODE* ptr;
k.N.iInterface = 100;
ptr = (NODE*)malloc(sizeof(NODE));

А до доступа:

ptr->N1->iInterface

N1 должно быть инициализировано чем-то.

0 голосов
/ 18 января 2010

Почтите это так

(*intDesc)->iInterface
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...