Aiuto per risolvere un problema con l'importazione di una funzione da una dll - pagina 4

 
Buon consiglio sul file Eche. Cercherò di usarlo. Certo, hai ragione, dovrebbero essere controllati. Volevo solo sentire la vostra opinione sul fatto che valga la pena prestarvi attenzione o meno, cioè controllarli. Ma a giudicare dalla descrizione, penso che sia quello di cui abbiamo parlato, cosa ne pensate? Non sono ancora molto bravo nel C++ pratico, capisco nel mio cervello che non c'è niente di globalmente difficile nello scrivere questi convertitori, ma al momento mi presenta ancora qualche difficoltà, e quindi voglio risolverlo il più semplicemente possibile, specialmente se c'è una funzione già pronta...
 

Fidati ma verifica :-). Proprio così.

 

Sto cercando di capire come fare un'implementazione in C++ Builder. Per quanto ho capito, per fare un file EXE, dovete fare una chiamata consecutiva a tre funzioni nella funzione WinMain:

ConvertData_1 (...);

rmatrixsvd(...);

ConvertData_2 (...);

Giusto? Cosa dobbiamo fare quando formiamo una DLL? Allo stesso modo? Ho qualche dubbio... Sto cercando di usare un libro di Arkhangelsky "Programming in C++ Builder"...

Ma finora senza risultato...

 

Non fa differenza se si lavora in Exe o Dll.

.

Ho copiato il mio post dalla pagina 2 di questo thread:

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

Dovreste dichiarare una funzione come questa
extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// qui, naturalmente passerete il numero di righe e colonne
{
//convertire i parametri di input in ap::real_2d_array
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ;
.
//calcolare
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3);
.
//tradurre il risultato di a3 in out
convertReal2DArrayToPDouble(a3, out);
.
ritorno;
}

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

.

Cosa c'entra la funzione WinMain? È una specie di punto d'ingresso al programma...

Mi scuso naturalmente, ma avete capito qual è la funzione?

.

Sii onesto, dal 2 al 6 settembre, quanto tempo hai già dedicato a questo compito?

Non sarebbe meglio chiedere una consulenza di 2 ore a un esperto (preparazione del codice + spiegazione)?

 

Grazie, ora ho capito... Tutte queste funzioni sono inquadrate da una esterna, che è quella che esporterò. Scusa, mi sono un po' confuso...

Per quanto riguarda lo specialista, mi piacerebbe... se ce ne fosse uno in giro da qualche parte. Ma, purtroppo, non ce ne sono, un peccato, naturalmente...

Questo è il Kazakistan... Anche se probabilmente ci sono buoni specialisti ad Almaty e Astana, ma non posso raggiungerli :-), a più di 1000 km di distanza.

Ecco perché devo capirlo da solo. Sì, ho già perso molto tempo :-). Beh, non importa ... Mosca non è stata costruita in un giorno. :-) Come si dice.

 

Non capisco bene Visual Studio 2010... Ora è disponibile solo la versione Beta? Per quanto ho capito, non c'è ancora un rilascio?

Il Visual Assist viene fornito separatamente?

E la penultima versione di Visual Studio 2008?

 

In senso stretto, ne avrete abbastanza dal 2005. O 2003.

Visual Assist è un'utilità di terze parti.

 

Per il compito in questione, naturalmente, questi sono sufficienti. Ma voglio tenerlo in prospettiva. Penso che questo compito non sarà l'ultimo...

Ma Visual Studio 2009 non sembra verificarsi, quindi vi ho chiesto le ultime versioni disponibili...

Per studiare... ...quindi studiate fino in cima... :-)

 

Finalmente è nato qualcosa... :-)

Ma ci sono alcuni problemi durante la compilazione, se si specifica che la funzione è esportabile...

Se si specifica:

1.) int SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), compila senza errori

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), allora ci sono errori:

[Errore ILINK32] Errore: Unresolved external 'ap::afree(void *)' referenziato da \COMP-BSN/MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[Errore ILINK32] Errore: Unresolved external 'ap::minint(int, int)' referenziato da \COMP-BSN!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[Errore ILINK32] Errore: esterno non risolto 'ap::amalloc(unsigned int, unsigned int)' referenziato da \COMP-BSN/MY DOCUMENTS!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
[Errore ILINK32] Errore: Unresolved external '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>&)' a cui si fa riferimento da \COMP-BSN\i miei documenti!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ

Come si può interpretare questo?

Forse c'è qualche errore nel mio codice?

Ecco il codice:

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

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

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
ritorno 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(linea, colonna) = inArr[linea*iCol + colonna];


ritorno 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);

ritorno 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[linea*iCol + colonna] = inArr(linea, colonna);

ritorno 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;
// alloca la memoria per gli array
int minmn = ap::minint(Row, Col);
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);

//convertire i parametri di input da doppio a ap::real_2d_array
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// svd-decomposizione della matrice
rmatrixsvd(A, Row, Col, Uneeded, VTneededed, AdditionalMemory, W, U, VT);

// convertire il risultato di W, U, VT in out
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);

ritorno 1;
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), poi si verificano errori:

[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

Caro, se carichi l'archivio con le fonti, cercherò di compilarlo e linkarlo.

E inoltre - promettimi di mostrarmi l'indicatore mq4 stesso :-).