На этом шаге мы приведем программу, реализующую указанное преобразование.
Текст программы приведен ниже, результат - на рисунке 1.
// 217_1.cpp: главный файл проекта. #include "stdafx.h" #include <stdio.h> using namespace System; using namespace System::Runtime::InteropServices; // unmanaged struct struct ListStruct { int count; double* item; }; #pragma unmanaged void UnmanagedTakesListStruct(ListStruct list) { printf_s("[unmanaged] count = %d\n", list.count); for (int i = 0; i < list.count; i++) printf_s("array[%d] = %.2f\n", i, list.item[i]); } #pragma managed void main() { ListStruct list; list.count = 10; list.item = new double[list.count]; // оператор >new размещает объект в native-куче // и возвращает указатель на этот объект. // В данном случае в куче формируется одномерный // массив из list.count элементов. Console::WriteLine("[managed] count = {0}", list.count); // создается указатель на объект, формирующий // случайные числа: Random^ r = gcnew Random(0); // инициализация массива list.item[] случайными // числами из интервала [0,1], умноженными на 100 for (int i = 0; i < list.count; i++) { list.item[i] = r->NextDouble() * 100.0; Console::WriteLine("array[{0}] = {1}", i, list.item[i]); } // вызов native-функции в managed-функции UnmanagedTakesListStruct(list); Console::ReadLine(); }
Рис.1. Результат работы с массивом элементов native-структуры в managed-функции
На следующем шаге мы рассмотрим доступ к символам в классе System::String.