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

 
EXE dosyası hakkında iyi tavsiyeler. kullanmaya çalışacağım. Doğrulamaya gelince, elbette haklısın, kontrol edilmeleri gerekiyor. Sadece onlara dikkat etmeye değer olup olmadığına dair fikrinizi duymak istedim, yani. Kontrol. Ama açıklamaya bakılırsa, bence, konuştuğumuz şey bu, ne düşünüyorsun? C++'da hala çok iyi bir pratik temele sahip değilim, bu dönüştürücüleri yazarken küresel olarak karmaşık bir şey olmadığını beynimle anlıyorum, ancak şu anda benim için hala bazı zorluklar sunuyor ve bu nedenle çözmek istiyorum. mümkün olduğunca basit, yani zaten hazır bir işlev varsa daha fazlası ...
 

Güven ama kontrol et :-). Her şey doğru.

 

C++ Builder'da nasıl uygulama yapılacağını bulmaya çalışıyorum. Anladığım kadarıyla bir EXE dosyası yapmak için WinMain fonksiyonunda projedeki üç fonksiyona sıralı bir çağrı yapmanız gerekiyor:

ConvertData_1(...);

matrissvd (...);

ConvertData_2(...);

Doğru şekilde? Peki ya DLL'nin oluşumu? Ayrıca? Bir konuda şüphelerim var... Arkhangelsky'nin "Programming in C++ Builder .." kitabından anlamaya çalışıyorum.

Ama şimdiye kadar hiçbir işe yaramadı...

 

Çalıştığınız Exe'de veya Dll'de fark yok.

.

Mesajımı bu konunun 2. sayfasından kopyaladım:

-------------------------------------------------- ---------

Bunun gibi bir şey beyan etmelisiniz:
extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(çift * giriş1, çift * giriş2, çift * çıkış)
// tabii ki burada satır ve sütun sayısını da geçiyorsunuz
{
// giriş parametrelerini ap::real_2d_array'e çevir
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ...;
.
// hesaplamak
ap::real_2d_array a3;
matrissvd(a1, a2, a3);
.
// a3'ün sonucunu dışarı çevir
convertReal2DArrayToPDoble(a3, çıkış);
.
dönüş;
}

-------------------------------------------------- ---------

.

Peki ya WinMain işlevi? Programa giriş noktası gibi...

Üzgünüm, elbette, ama bir işlevin ne olduğunu anlıyor musunuz?

.

Dürüst olun, 2 Eylül'den 6 Eylül'e kadar bu görev için ne kadar zaman harcadınız?

Bir uzmanla 2 saatlik bir konsültasyon talep etmek (kod hazırlama + açıklama) daha iyi olmaz mıydı?

 

Teşekkürler, şimdi anlıyorum... tüm bu işlevler, dışa aktaracağım harici bir işlevle çerçeveleniyor. pardon biraz karıştırdım...

Uzmana gelince, çok isterim ... yakınlarda böyle insanlar olsaydı. Ama ne yazık ki hiçbiri yok, ne yazık ki elbette ...

Bu Kazakistan ... muhtemelen Almatı ve Astana'da iyi uzmanlar olmasına rağmen, onlara ulaşamıyorum :-), 1000 km'den fazla.

Bu nedenle, her şeye kendiniz ulaşmak zorundasınız. Evet, zaten çok zaman harcadım :-). Şey, hiçbir şey... Moskova da hemen inşa edilmedi... :-) dedikleri gibi.

 

Visual Studio 2010'dan pek anlamıyorum... Şu anda yalnızca Beta sürümü mevcut mu? Serbest bırak, henüz anladığım kadarıyla?

Visual Assist ayrı mı geliyor?

Visual Studio 2008'in sondan bir önceki sürümü ne olacak?

 

Kesin konuşmak gerekirse, 2005 sizin için yeterli. Veya 2003.

Visual Assist, üçüncü taraf bir yardımcı programdır.

 

Bu görev için elbette bunlar yeterli olacaktır. Ama gelecek için bir şey istiyorum. Bunun son olacağını sanmıyorum...

Ancak Visual Studio 2009 bulunamıyor gibi görünüyor, bu yüzden size mevcut en son sürümleri sordum ...

Çalış ... o yüzden sonuna kadar çalış ... :-)

 

Sonunda bir şey doğuyor... :-)

Ancak işlevin dışa aktarıldığını belirtirseniz bazı derleme sorunları vardır...

Belirtirseniz:

1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), hatasız derleme

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), sonra hatalar oluşur:

[ILINK32 Hatası] Hata: Çözümlenmemiş harici 'ap::afree(void *)', \\COMP-BSN\MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ'den referans alındı
[ILINK32 Hatası] Hata: Çözümlenmemiş harici 'ap::minint(int, int)', \\COMP-BSN\MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ'den referans alındı
[ILINK32 Hatası] Hata: \\COMP-BSN\MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL'den referans alınan çözümlenmemiş harici 'ap::amalloc(unsigned int, unsigned int)'
[ILINK32 Hatası] Hata: Çözümlenmemiş harici 'rmatrixsvd(ap::template_2d_array<double, 1>, int, int, int, int, int, ap::template_1d_array<double, 1>&, ap::template_2d_array<double, 1 >&, ap::template_2d_array<double, 1>&)' \\COMP-BSN\MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ'den referans alındı

Bu nasıl yorumlanabilir?

Belki kodumda bir hata vardır?

İşte kod:

//------------------------------------------------ ----------------------------

#include <windows.h>
//"H_svd_dll.h"yi dahil et
//------------------------------------------------ ----------------------------

#pragma tartışıldı

int WINAPI DllEntryPoint(HINSTANCE ipucu, imzasız uzun neden, void* lpReserved)
{
dönüş 1;
}

//------------------------------------------------ ----------------------------
#include "stdafx.h"
#include "svd.h"
//------------------------------------------------ ----------------------------

int Convert_Double_To_Real_2D_Array(double inArr[], ap::real_2d_array outArr, int iRow, int iCol)
{

for(int satır = 0; satır < iRow; satır++)
for(int sütun = 0; sütun < iCol; sütun++)
outArr(satır, sütun) = inArr[satır*iCol + sütun];


dönüş 1;
}

//------------------------------------------------ ----------------------------

int Convert_Real_1D_Array_To_Double(ap::real_1d_array inArr, double outArr[], int iRow, int iCol)
{
int minmn = ap::minint(iRow, iCol);
for(int i = 0; i < minmn; i++)
outArr[i] = inArr(i);

dönüş 1;
}

//------------------------------------------------ ----------------------------

int Convert_Real_2D_Array_To_Double(ap::real_2d_array inArr, double outArr[], int iRow, int iCol)
{
for(int satır = 0; satır < iRow; satır++)
for(int sütun = 0; sütun < iCol; sütun++)
outArr[satır*iCol + sütun] = inArr(satır, sütun);

dönüş 1;
}

//------------------------------------------------ ----------------------------

extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double çıkışU[], çift çıkışVT[], int Satır, int Sütun)
//int SVD_DLL(çift girişA[], çift çıkışW[], çift çıkışU[], çift çıkışVT[], int Satır, int Sütun)
{
ap::real_2d_array A;
ap::real_1d_array W;
ap::real_2d_arrayU;
ap::real_2d_array VT;
int gereksiz = 2;
int VTneeded = 2;
int EkBellek = 2;
// Diziler için bellek ayırın
int minmn = ap::minint(Satır, Sütun);
A.setbounds(0, Row-1, 0, Col-1);
w.setbounds(0, minmn-1);
U.setbounds(0, Row-1, 0, Col-1);
VT.setbounds(0, Row-1, 0, Col-1);

// giriş parametrelerini double'dan ap::real_2d_array'e aktar
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// svd matris ayrıştırması
rmatrixsvd(A, Row, Col, Gereksiz, VTneeded, EkBellek, W, U, VT);

// W, U, VT sonucunu out'a çevir
Convert_Real_1D_Array_To_Double(W, outW, Row, Col);
Convert_Real_2D_Array_To_Double(U, outU, Row, Col);
Convert_Real_2D_Array_To_Double(VT, outVT, Row, Col);

dönüş 1;
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), sonra hatalar oluşur:

[ILINK32 Error] Error: Unresolved external 'ap::afree(void *)' referenced from \\COMP-BSN\МОИ ДОКУМЕНТЫ\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Sevgili, kaynak arşivi gönderirseniz, derleyip bağlantılandırmaya çalışacağım.

Ayrıca bana mq4 göstergesinin kendisini göstereceğine söz ver :-).