Aracılığıyla paylaş


Nasıl yapılır: C++ Birlikte Çalışması Kullanarak Dizileri Sıralama

Bu konu başlığında Visual C++ birlikte çalışabilirliğinin bir özelliği gösterilmektedir. Daha fazla bilgi için bkz . C++ Birlikte Çalışma Kullanma (Örtük PInvoke).

Aşağıdaki kod örnekleri yönetilen ve yönetilmeyen işlevleri aynı dosyada uygulamak için yönetilen, yönetilmeyen #pragma yönergelerini kullanır, ancak bu işlevler ayrı dosyalarda tanımlanırsa aynı şekilde birlikte çalışır. Yalnızca yönetilmeyen işlevleri içeren dosyaların /clr (Ortak Dil Çalışma Zamanı Derlemesi) ile derlenmesi gerekmez.

Örnek: Yönetilen diziyi yönetilmeyen işleve geçirme

Aşağıdaki örnekte yönetilen bir dizinin yönetilmeyen bir işleve nasıl geçirilmeye çalışıldığı gösterilmektedir. Yönetilen işlev, yönetilmeyen işlevi çağırmadan önce dizinin çöp toplamasını engellemek için pin_ptr (C++/CLI) kullanır. Yönetilmeyen işleve GC yığınına sabitlenmiş bir işaretçi sağlanarak, dizinin bir kopyasını oluşturma yükü önlenebilir. Yönetilmeyen işlevin GC yığın belleğine eriştiğini göstermek için dizinin içeriğini değiştirir ve yönetilen işlev denetimi sürdürürken değişiklikler yansıtılır.

// PassArray1.cpp
// compile with: /clr
#ifndef _CRT_RAND_S
#define _CRT_RAND_S
#endif

#include <iostream>
#include <stdlib.h>
using namespace std;

using namespace System;

#pragma unmanaged

void TakesAnArray(int* a, int c) {
   cout << "(unmanaged) array received:\n";
   for (int i=0; i<c; i++)
      cout << "a[" << i << "] = " << a[i] << "\n";

   unsigned int number;
   errno_t err;

   cout << "(unmanaged) modifying array contents...\n";
   for (int i=0; i<c; i++) {
      err = rand_s( &number );
      if ( err == 0 )
         a[i] = number % 100;
   }
}

#pragma managed

int main() {
   array<int>^ nums = gcnew array<int>(5);

   nums[0] = 0;
   nums[1] = 1;
   nums[2] = 2;
   nums[3] = 3;
   nums[4] = 4;

   Console::WriteLine("(managed) array created:");
   for (int i=0; i<5; i++)
      Console::WriteLine("a[{0}] = {1}", i, nums[i]);

   pin_ptr<int> pp = &nums[0];
   TakesAnArray(pp, 5);

   Console::WriteLine("(managed) contents:");
   for (int i=0; i<5; i++)
      Console::WriteLine("a[{0}] = {1}", i, nums[i]);
}

Örnek: Yönetilmeyen diziyi yönetilen işleve geçirme

Aşağıdaki örnek, yönetilmeyen bir diziyi yönetilen bir işleve geçirmeyi gösterir. Yönetilen işlev, dizi belleğine doğrudan erişir (yönetilen dizi oluşturmanın ve dizi içeriğini kopyalamanın aksine), yönetilen işlev tarafından yapılan değişikliklerin denetimi yeniden kazandığında yönetilmeyen işleve yansıtılmasını sağlar.

// PassArray2.cpp
// compile with: /clr
#include <iostream>
using namespace std;

using namespace System;

#pragma managed

void ManagedTakesAnArray(int* a, int c) {
   Console::WriteLine("(managed) array received:");
   for (int i=0; i<c; i++)
      Console::WriteLine("a[{0}] = {1}", i, a[i]);

   cout << "(managed) modifying array contents...\n";
   Random^ r = gcnew Random(DateTime::Now.Second);
   for (int i=0; i<c; i++)
      a[i] = r->Next(100);
}

#pragma unmanaged

void NativeFunc() {
   int nums[5] = { 0, 1, 2, 3, 4 };

   printf_s("(unmanaged) array created:\n");
   for (int i=0; i<5; i++)
      printf_s("a[%d] = %d\n", i, nums[i]);

   ManagedTakesAnArray(nums, 5);

   printf_s("(ummanaged) contents:\n");
   for (int i=0; i<5; i++)
      printf_s("a[%d] = %d\n", i, nums[i]);
}

#pragma managed

int main() {
   NativeFunc();
}

Ayrıca bkz.

C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)