Массив структур CLI - PullRequest
       8

Массив структур CLI

0 голосов
/ 06 апреля 2010
public value struct ListOfWindows
{
 HWND hWindow;
 int winID;
 String^ capName;
};

вот моя структура, теперь я создал их массив:

array<ListOfWindows ^> ^ MyArray =  gcnew array<ListOfWindows ^>(5);

Теперь, чтобы проверить, работает ли это, я сделал простую функцию:

void AddStruct( )
{
  HWND temp = ::FindWindow( NULL, "Test" );
  if( temp == NULL ) return;
  MyArray[0]->hWindow = temp; // debug time error..

  return;
}

ОШИБКА: An unhandled exception of type 'System.NullReferenceException' occurred in Window.exe

Additional information: Object reference not set to an instance of an object.

не знаю, что делать .. вроде как плохо знаком с CLI, так что если вы можете помочь, пожалуйста, сделайте .. Спасибо.

Ответы [ 2 ]

0 голосов
/ 22 октября 2014

Сначала вы создаете массив ссылок, а не массив значений, поэтому @ timo-geusch говорит, что вам нужно создавать эти объекты после создания массива ссылок.

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

array<ListOfWindows>^ MyArray =  gcnew array<ListOfWindows>(5);

Тогда вы получите доступ к этим значениям с помощью. оператор вместо оператора ->, вот так.

void AddStruct( )
{
    HWND temp = ::FindWindow( NULL, "Test" );
    if( temp == NULL ) return;
    MyArray[0].hWindow = temp; // << here you access the value type, not the reference
    return;
}

Надеюсь, что поможет

0 голосов
/ 06 апреля 2010

Ну, у вас есть массив ссылок на объекты, но я не вижу кода, который фактически помещает объект в любой из них. Перед доступом к MyArray[0] вы можете поместить объект в массив в позиции 0.

Я бы изменил ListOfWindows на класс ref - в вашем контексте не имеет смысла использовать его в качестве класса значений - и тогда вы можете добавить объект в массив следующим образом:

MyArray[0] = gcnew ListOfWindows;

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

...