Hilfe bei der Lösung eines Problems beim Importieren einer Funktion aus einer DLL - Seite 4

 
Ein guter Ratschlag zur Eche-Datei. Ich werde versuchen, sie zu verwenden. Natürlich haben Sie Recht, sie sollten überprüft werden. Ich wollte nur eure Meinung dazu hören, ob es sich lohnt, ihnen Aufmerksamkeit zu schenken oder nicht, d.h. sie zu überprüfen. Aber der Beschreibung nach zu urteilen, denke ich, dass es das ist, worüber wir gesprochen haben, was meint ihr? Ich bin noch nicht sehr gut in praktischem C++, ich verstehe mit meinem Gehirn, dass es nichts global Kompliziertes gibt, wenn ich diese Konverter schreibe, aber im Moment ist es noch ein bisschen kompliziert für mich und deshalb möchte ich es so einfach wie möglich lösen, besonders wenn es eine fertige Funktion gibt...
 

Vertraue, aber überprüfe :-). Das ist richtig.

 

Ich versuche herauszufinden, wie ich eine Implementierung in C++ Builder erstellen kann. Soweit ich weiß, müssen Sie zur Erstellung einer EXE-Datei nacheinander drei Funktionen in der WinMain-Funktion aufrufen:

ConvertData_1 (...);

rmatrixsvd(...);

ConvertData_2 (...);

Oder? Was sollten wir tun, wenn wir eine DLL bilden? Auf dieselbe Art und Weise? Ich habe einige Zweifel... Ich versuche, ein Buch von Arkhangelsky "Programming in C++ Builder" zu verwenden...

Aber bis jetzt ohne Erfolg...

 

Es macht keinen Unterschied, ob Sie in Exe oder Dll arbeiten.

.

Ich habe meinen Beitrag von Seite 2 dieses Threads kopiert:

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

Sie sollten eine Funktion wie diese deklarieren
extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// hier geben Sie natürlich die Anzahl der Zeilen und Spalten an
{
//Eingabeparameter in ap::real_2d_array umwandeln
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ;
.
//berechnen
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3);
.
//Übersetzen des Ergebnisses von a3 in out
convertReal2DArrayToPDouble(a3, out);
.
Rückkehr;
}

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

.

Was hat die Funktion WinMain damit zu tun? Es ist sozusagen der Einstieg in das Programm...

Ich entschuldige mich natürlich, aber verstehen Sie, was die Funktion ist?

.

Seien Sie ehrlich: Wie viel Zeit haben Sie vom 2. bis 6. September bereits auf diese Aufgabe verwendet?

Wäre es nicht besser, um eine 2-stündige Beratung durch einen Experten zu bitten (Codevorbereitung + Erklärung)?

 

Danke, jetzt habe ich es verstanden... Alle diese Funktionen werden von einer externen Funktion eingerahmt, die ich exportieren werde. Entschuldigung, ich war etwas verwirrt...

Was den Spezialisten betrifft, so würde ich gerne... wenn es irgendwo einen gäbe. Aber leider gibt es keine, was natürlich schade ist...

Das ist Kasachstan... Zwar gibt es wahrscheinlich gute Spezialisten in Almaty und Astana, aber ich kann sie nicht erreichen :-), über 1000 km entfernt.

Deshalb muss ich es selbst herausfinden. Ja, ich habe schon eine Menge Zeit verschwendet :-). Na ja, egal ... Moskau wurde auch nicht an einem Tag erbaut... :-) Wie man so schön sagt.

 

Ich verstehe das mit Visual Studio 2010 nicht ganz... Ist jetzt nur die Beta-Version verfügbar? Soviel ich weiß, gibt es noch keine Freigabe?

Ist Visual Assist separat erhältlich?

Was ist mit der vorletzten Version von Visual Studio 2008?

 

Streng genommen werden Sie ab 2005 genug haben. Oder 2003.

Visual Assist ist ein Dienstprogramm eines Drittanbieters.

 

Für die anstehende Aufgabe sind diese natürlich ausreichend. Aber ich möchte die Sache im Auge behalten. Ich denke, diese Aufgabe wird nicht die letzte sein...

Aber Visual Studio 2009 scheint nicht aufzutreten, so fragte ich Sie über die neuesten verfügbaren Versionen ...

Zum Studium... ...also studieren Sie bis ganz nach oben... :-)

 

Endlich ist etwas geboren worden... :-)

Aber es gibt einige Probleme bei der Kompilierung, wenn Sie angeben, dass die Funktion exportierbar ist...

Wenn Sie angeben:

1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), kompiliert ohne Fehler

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), dann gibt es Fehler:

[ILINK32-Fehler] Fehler: Nicht aufgelöstes externes 'ap::afree(void *)' referenziert von \COMP-BSN/MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[ILINK32-Fehler] Fehler: Nicht aufgelöstes externes 'ap::minint(int, int)' referenziert von \COMP-BSN!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[ILINK32-Fehler] Fehler: Nicht aufgelöstes externes 'ap::amalloc(unsigned int, unsigned int)' referenziert von \COMP-BSN/MY DOCUMENTS!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[ILINK32-Fehler] Fehler: Nicht aufgelöste externe 'rmatrixsvd(ap::template_2d_array<double, 1>, int, int, int, int, ap::template_1d_array<double, 1>&, ap::template_2d_array<double, 1>&, ap::template_2d_array<double, 1>&)' referenziert von \COMP-BSN\ MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Wie ist dies zu interpretieren?

Vielleicht gibt es einen Fehler in meinem Code?

Hier ist der Code:

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

#include <windows.h>
//include "H_svd_dll.h"
//---------------------------------------------------------------------------

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
Rückkehr 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 line = 0; line < iRow; line++)
for(int column = 0; column < iCol; column++)
outArr(Zeile, Spalte) = inArr[Zeile*iCol + Spalte];


Rückkehr 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);

Rückkehr 1;
}

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

int Convert_Real_2D_Array_To_Double(ap::real_2d_array inArr, double outArr[], int iRow, int iCol)
{
for(int line = 0; line < iRow; line++)
for(int column = 0; column < iCol; column++)
outArr[Zeile*iCol + Spalte] = inArr(Zeile, Spalte);

Rückkehr 1;
}

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

extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
//int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col)
{
ap::real_2d_array A;
ap::real_1d_array W;
ap::real_2d_array U;
ap::real_2d_array VT;
int Uneeded = 2;
int VTneeded = 2;
int AdditionalMemory = 2;
// Speicher für Arrays zuweisen
int minmn = ap::minint(Zeile, Spalte);
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);

//Eingabeparameter von double in ap::real_2d_array konvertieren
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// svd-Zerlegung der Matrix
rmatrixsvd(A, Row, Col, Uneeded, VTneeded, AdditionalMemory, W, U, VT);

// das Ergebnis von W, U, VT in out umwandeln
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);

Rückkehr 1;
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), dann treten Fehler auf:

[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

Wenn Sie das Archiv mit den Quellen hochladen, werde ich versuchen, es zu kompilieren und zu verlinken.

Und versprechen Sie, mir den mq4-Indikator selbst zu zeigen :-).

Grund der Beschwerde: