Hilfe bei der Lösung eines Problems beim Importieren einer Funktion aus einer DLL - Seite 4
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
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;
}
[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 :-).