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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin