Bir dll'den bir işlevi içe aktarma sorununu anlamaya yardımcı olun - sayfa 3

 

Hayır, teşekkürler :-). Her şeyi kendin yapacaksın :-).

Adımlar halinde düzenlenmiştir:

.

#1 (test yapamazsınız ;-):

C++'da MAX_ROW = 5..10 satır, MAX_COL = 5..10 sütun (rastgele sayılar) içeren bir matris oluşturun.

Verilerle rastgele doldurma yapın.

.

#2 (test, yapamazsınız ;-) : aşağıdaki sorunu çözün:

1. adımdaki matris tek boyutlu biçimde temsil edilmelidir.

verilerin formüle göre depolandığı size=MAX_ROW*MAX_COL şeklinde tek boyutlu bir çift dizi oluşturun

for(satır = 0 .. MAX_COL-1)

for(sütun = 0 .. MAX_COL-1)

dizi[satır*MAX_COL + sütun] = veri[satır][sütun];

.

#3: aşağıdaki problemi çözün / fonksiyon olarak

Adım (2)'den satır ve sütun sayısı olan tek boyutlu bir çift dizi elde edersiniz.

Bu dizideki verileri ap::real_2d_array nesnesine koymalısınız

.

#4: Bir işlev olarak ap::real_2d_array / nesnesini alırsınız

Bunu tek boyutlu bir çift diziye dönüştürmeli, satır ve sütun sayısını almalısınız.

.

#5 (test yapamazsınız ;-):

İki boyutlu bir matrise dönüştürmeniz gereken tek boyutlu bir dizi (1. adımda olduğu gibi).

Ortaya çıkan matrisi 1. adımdaki orijinal matrisle karşılaştırın.

Tutarsızlık durumunda, onunla ilgilenin.

.

İhtiyaç duyulacak ana işlevler, işlev 3 ve 4'tür.

Adım 1,2 = eğitim, verileri bu şekilde Mql'de paketlemeniz gerekecek, adım 5 = test.

.

Genel olarak, 5 adımın her biri için işlevler yapardım.

.

Mql'de tekil dönüşüm.

https://www.mql5.com/ru/code/7359

 

Bu tekil değer ayrıştırma algoritmasının nasıl çalışması gerektiğine dair ayrıntılı döküm için teşekkür ederiz. 1-3. maddeler uygulandı. 4. maddede bir sorun vardı çünkü. Daha önce yazdığım gibi, rmatrixsvd (...) işlevinin dışa aktarımı ile hala çalışan bir dll oluşturamıyorum,

orijinal C++ kodundaki giriş nedeniyle: extern "C" bool __declspec(dllexport) __stdcall rmatrixsvd (...), hatalar başlar ... ancak sadece bool rmatrixsvd (...) derlerseniz hata olmaz ... ama dışa aktarılmış bir işleve ihtiyacım var ... İşte sersemlik ...

Yardım için teşekkürler.

 

4. madde (ve diğerleri) ile ilgili. rmatrixsvd'nin bununla hiçbir ilgisi yok.

Tekil değer ayrıştırma algoritmasının yanı sıra. bunlar ilgili maddeler

Dll'den/Dll'ye veri aktarmak-almak için.

.

4. adım için yazılacak fonksiyonun prototipi :

void Convert_real_2d_array_to_double(

const ap::real_2d_array & dizi,

çift * veri,

int ve çizgiler,

int ve sütunlar

);

.

Onlar. ap::real_2d_array'den satır, sütun ve veri sayısını nasıl alacağınızı öğrenmeniz gerekir.

.

Bundan:

const ap::real_2d_array & dizi

---->>>

bunu al:

çift * veri,

int ve çizgiler,

int ve sütunlar

 

Zaman ayırdığınız için tekrar çok teşekkür ederim.

Bir kez daha tüm girişleri çok dikkatli bir şekilde okudum ve sonunda ne yapılması gerektiği aklıma geldi :-).

Gerçekten de, rmatrixsvd işlevinin kendisi burada olduğu gibi bir "iş gücü"dür ve onu dışa aktarmaya çalışmanıza gerek yoktur,

ve malları zamanında sepete koymanız ve teslim edildiğinde dikkatlice doğru yere boşaltmanız gerekir.

randevuyla. mecazi anlamda konuşuyor. Şimdi seni doğru anlıyor muyum?

Onlar. Bu veri dönüştürücülerini C++'da 3 ve 4 noktalarını yapmam ve aslında onlarla MQL'de çalışmam gerekiyor, yani. onları MQL'de ve DLL'de ilan ederler.

Metatrader'ın onlarla çalışabilmesi için ihraç edilebilir olarak beyan edilmelidir. Sorunumu doğru anlıyor muyum?

Eğer öyleyse ve bana öyle geliyor ki şimdi seni anlıyorum, o zaman bu daha da iyi çünkü. Daha sonra iki boyutlu ve tek boyutlu dizileri nasıl bağlayacağımı bilmiyordum.

Ayrıca, MQL'de bir diziyi a[ ][ ]? Onlar. en azından a[ ][100] olarak bildirilmelidir. Öyle mi? ya da ben hatalıyım?

Ve bu çok uygun değil çünkü. iki boyutlu bir dizinin boyutunun ne olacağını önceden bilmiyorsunuz ve gelecekte bir dizi için önceden bellek ayırmak en iyi seçenek değil,

Bu sorun C++'da yok mu? onlar. iki boyutlu bir dizi mecazi anlamda "kauçuk" olabilir. Bu doğru? Yoksa C++'da da bazı nüanslar var mı?

Ben de size Borland Builder 2009'u sormak istedim. Belki 6 kadar buggy değildir? Ve prensipte üzerinde çalışmak mümkün mü?

Ve sonra genel olarak, anladığım kadarıyla, onun bir debilder olduğunu söyledi. :-) Anladığım kadarıyla Visual Studio'da programlıyor musunuz? O daha mı sert? Ve hiçbir aksaklık yok mu? Şimdi en son sürüm nedir?

Yardımınızla sorunumun özünü anladığıma sevindim. Şimdi bunu deneyeceğim...

 
boysn >> :

Ayrıca, MQL'de bir diziyi a[ ][ ]? Onlar. en azından a[ ][100] olarak bildirilmelidir. Öyle mi? ya da ben hatalıyım?

Ve bu çok uygun değil çünkü. iki boyutlu bir dizinin boyutunun ne olacağını önceden bilmiyorsunuz ve gelecekte bir dizi için önceden bellek ayırmak en iyi seçenek değil,

İyi! :-) Sürecin bir yere taşınmasına çok sevindim :-).

.

Elbette, iki boyutlu dizileri Mql4'te bildirebilirsiniz.

Ve aynı şekilde, bir Dll'den bir işlevi içe aktarabilirsiniz.

#myLib'i içe aktar

void showMatrix(çift ve dizi[][], int satırlar, int sütunlar);

#içe aktarmak

.

Ama burada bir nüans var: C'de tek boyutlu bir dizi alan bir fonksiyon ilan ediyoruz,

satır ve sütun sayısı void showMatrix(double *array, int satırlar, int sütunlar);

Ve dizi tek boyutlu bir dizi gibi çalışır, adresleme bir döngü içinde düzenlenir:

for(satır = 0 .. MAX_COL-1)
for(sütun = 0 .. MAX_COL-1)
dizi[satır*MAX_COL + sütun] = veri[satır][sütun];

.

Onlar. Mql, bitişik bir arabelleğe sahip bir 2B dizi atar.

.

Sadece aynı tırmık üzerine basmayın - Dll'nizde 3. ve 4. adımdaki işlevler kullanılır,

satır/sütun sayısı ile Mql'den tek boyutlu dizileri kabul edecek olan Dll-ins arabirim işlevinin içinde.

Onları ap::real_2d_array'e çevirecek, rmatrixsvd'ye iletecek

ve zaten sonuç, satırların ve sütunların boyutu olan çıktı arabelleğine yerleştirilecektir.

doğru olmalı.

.

Çıktı arabelleğini önceden rezerve edin - bu Mql'de yapılmalıdır.

Ve eğer boyutlar bilinmiyorsa bence yapılması gereken şudur.

tek boyutlu büyük boyutlu dizi, örneğin

ikiye katla[2500];

ve çıktı değerleri için bir öğenin dizileri satır/sütun sayısı

çift ham [1];

çiftkollar[1];

.

Visual Studio daha havalı. Özellikle Görsel Asistan ile. STL'nin debilder'da nasıl çalıştığını bilmiyorum. Unicode sorunları ile neredeyse %100.

Win SDK yardımı, MSDN ile eşleşmiyor. Söylentiye göre, borland derleyicisi Delphi ile entegrasyon için

artılar için olumlu olmayan değişiklikler geçirdi.

.

Ve hafıza ile çalışmak ders için bir konudur.

 

Teorik olarak her şey açık gibi görünüyor, uygulamaya başlayacağım ve sonra göreceğiz :-). "Gözler korkutuyor ama eller yapıyor.."

Değerli ipuçlarınız için tekrar teşekkürler. Bu algoritmayı uygulamayı çok isterim ... Aksi takdirde, her zamanki gibi, fikir zaten stratejik olarak çok ileri gitti, ancak taktik ve pratik olarak

onu kovalamalısın. Umarım benim için her şey yolunda gider. Herhangi bir sorum olursa, tavsiyede bulunma nezaketini inkar etmeyin. Sayesinde!

 

Dinamik dizilerin boyutuna bir kez daha açıklık getirmek istiyorum.

MQL'de, tek boyutlu bir dizi dizi[ ] olarak tanımlanabilir ve daha sonra programda dizi boyutu N bilindiğinde,

ardından ArrayResize (dizi, N) işlevini kullanarak. İki boyutlu bir dizi yalnızca dizi[ ][100] olarak tanımlanabilir, yani. ikinci boyut

her neyse, kesinlikle bilmelisiniz ve bilmiyorsanız, her durumda yeterli olması için maksimuma çıkarın. MQL'de tanımlayabilirsiniz

iki boyutlu bir dizi dizisi[ ][ ], derleyici bundan şikayet etmez, ancak ArrayResize işlevi dizinin ilk boyutunda yeni boyutu ayarlar,

MQL'de ikinci boyut için böyle bir fonksiyon yoktur. İki boyutlu bir dizi [N][M] tanımlarsanız, derleyici bu konuda bir hata verecektir, bu beklenen bir durumdur.

tamsayı, yani boyutlar önceden tanımlanmalıdır, en azından dizinin ikinci boyutu.

C++'da da mı? Bundan kaçacak bir yer var mı? Bir kez daha açıklık getirmek istiyorum.

Tekil ayrıştırma, C++ için AP Kitaplığını kullanır (açıklama ekteki dosyadadır). Bazı işlevler var anladığım kadarıyla belirleyici

dizilerin dinamik birinci ve ikinci boyutlarının sorunları. Veri dönüştürücüleri yazarken bunları DLL içinde benim durumumda kullanabilir miyim?

geçersiz ayar sınırları( int iLow1, int iHigh1, int iLow2, int iHigh2)
Bir dizi için bellek ayırın. Aynı zamanda dizinin eski içerikleri silinir ve ona ayrılan bellek serbest bırakılır, ardından (iHigh1-iLow1+1)*(iHigh2-iLow2+1) öğelerinden oluşan ayrı bir bellek alanı yeniden tahsis edilir. .
Yeni dizideki öğelerin birinci boyuta göre numaralandırılması, ikinci boyut için benzer şekilde iLow1'den başlar ve iHigh1 ile biter.
Yeni dizinin içeriği tanımsız.

Bir de şu fonksiyon var:

void setcontent( int iLow1, int iHigh1, int iLow2, int iHigh2, const T *pContent)
Yöntem, bellek ayrıldıktan sonra pContent[] dizisinin içeriğinin buna kopyalanması dışında setbounds() yöntemine benzer.
pContent dizisi, satır satır yazılmış iki boyutlu bir dizi içerir; [iLow1, iLow2] öğesi önce gelir, ardından [iLow1, iLow2+1] vb.

Doğru anladıysam, tam olarak ihtiyacım olan işlev bu, yani. tek boyutlu bir diziden iki boyutlu bir dizi yapar, yani. Temel olarak, bir dönüştürücüdür.

doğru mu anladım

 

C++ için AP Kitaplığı

 
C++ için AP Kitaplığı
Dosyalar:
 

MQL : tek boyutlu boyutta istediğimiz gibi değişiriz, evet. Sonra her şeyi dizinlere göre alırız (satır * MAX_COL + sütun).

2D'de 2. boyut sabittir. Onlar. a[100][100] dizisindeki [15][32] matrisinin elemanları artık sayılmaz.

.

Ve AP kitaplığının işlevleri nasıl çalışır - bir göz atmanızı öneririm.

Dll'de durmayın. Bir Exe yazın, çalıştırmak ve hata ayıklamak daha kolaydır.

Hata ayıklama yazdırma (hata ayıklama yazdırma) ekleyin.

Elbette tavsiye verebilirim ama tavsiye için, iyi bir şekilde, kontrol etmelisin-

test kodu yaz.

.

Ve dizinin içeriği ve değişkenler hakkında, nerede olduğu önemli değil-

onları bir kural olarak zorla almak, katı bir şekilde başlatmak daha iyidir.

Neden: