Ayuda para resolver un problema con la importación de una función desde una dll - página 4

 
Buen consejo sobre el archivo Eche. Intentaré usarlo. Por supuesto, tienes razón, deberían ser revisados. Sólo quería saber tu opinión sobre si merece la pena prestarles atención o no, es decir, comprobarlos. Pero a juzgar por la descripción, creo que esto es de lo que hablamos, ¿qué opinas? Todavía no soy muy bueno en C++ práctico, entiendo en mi cerebro que no hay nada globalmente difícil en la escritura de estos convertidores, pero por el momento todavía presenta alguna dificultad para mí, y por lo tanto quiero resolverlo de la manera más simple posible, sobre todo si hay una función preparada...
 

Confía pero verifica :-). Así es.

 

Estoy tratando de averiguar cómo hacer una implementación en C++ Builder. Según tengo entendido, para hacer un archivo EXE, hay que hacer una llamada consecutiva a tres funciones en la función WinMain:

ConvertData_1 (...);

rmatrixsvd(...);

ConvertData_2 (...);

¿Verdad? ¿Qué debemos hacer al formar una DLL? ¿De la misma manera? Tengo algunas dudas... Estoy intentando utilizar un libro de Arkhangelsky "Programming in C++ Builder"...

Pero hasta ahora no ha servido de nada...

 

Es indiferente que se trabaje en Exe o en Dll.

.

Copiado mi post de la página 2 de este hilo:

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

Debe declarar una función como la siguiente
extern "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// aquí, por supuesto, pasará el número de filas y columnas
{
//convertir los parámetros de entrada en ap::real_2d_array
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ;
.
//calcular
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3);
.
//traducir el resultado de a3 a out
convertReal2DArrayToPDouble(a3, out);
.
volver;
}

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

.

¿Qué tiene que ver la función WinMain? Es una especie de punto de entrada al programa...

Me disculpo, por supuesto, pero ¿entiendes cuál es la función?

.

Sé sincero, del 2 al 6 de septiembre, ¿cuánto tiempo has dedicado ya a esta tarea?

¿No sería mejor pedir una consulta de 2 horas a un experto (preparación del código + explicación)?

 

Gracias, ahora lo entiendo... Todas estas funciones están enmarcadas por una externa, que es la que voy a exportar. Lo siento, me confundí un poco...

Sobre el especialista, me encantaría... si hubiera uno por ahí. Pero, por desgracia, no hay ninguno, una pena, claro...

Esto es Kazajistán... Aunque probablemente haya buenos especialistas en Almaty y Astana, pero no puedo llegar a ellos :-), a más de 1000 km de distancia.

Por eso tengo que resolverlo por mi cuenta. Sí, ya he perdido mucho tiempo :-). Bueno, no importa... Moscú tampoco se construyó en un día. :-) Como dicen.

 

No entiendo muy bien lo de Visual Studio 2010... ¿Sólo está disponible la versión Beta? Por lo que tengo entendido, todavía no se ha producido ningún lanzamiento.

¿Viene el Visual Assist por separado?

¿Y la penúltima versión de Visual Studio 2008?

 

Estrictamente hablando, tendrás suficiente desde 2005. O 2003.

Visual Assist es una utilidad de terceros.

 

Para la tarea que nos ocupa, por supuesto, son suficientes. Pero quiero mantenerlo en perspectiva. Creo que esta tarea no será la última...

Pero Visual Studio 2009 no parece ocurrir, así que le pregunté acerca de las últimas versiones disponibles...

Para estudiar... ...así que estudia hasta lo más alto... :-)

 

Por fin ha nacido algo... :-)

Pero hay algunos problemas durante la compilación, si se especifica que la función es exportable...

Si lo especifica:

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

2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), entonces hay errores:

Error [ILINK32]: Error: Unresolved external 'ap::afree(void *)' referenced from \COMP-BSN/MY DOCUMENTS\!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
Error [ILINK32]: No se ha resuelto el error 'ap::minint(int, int)' referenciado desde \COMP-BSN!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECT\DEBUG_BUILD\U_SVD_DLL.OBJ
Error [ILINK32]: Error: Unresolved external 'ap::amalloc(unsigned int, unsigned int)' referenced from \COMP-BSN/MY DOCUMENTS!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJECTDEBUG_BUILD\U_SVD_DLL.OBJ
Error [ILINK32]: No se ha resuelto el problema de 'rmatrixsvd(ap::template_2d_array<double, 1>, int, int, int, ap::template_1d_array<double, 1>&, ap:¡:template_2d_array<double, 1>&, ap::template_2d_array<double, 1>&)' referenciado desde \COMP-BSN\ MY DOCUMENTS\!ALGORITMOS\NDEVD\NDEVUELTA_DLL\N2009.09.07\NPROYECTO\NDEBUG_BUILDU_SVD_DLL.OBJ

¿Cómo se puede interpretar esto?

¿Tal vez hay algún error en mi código?

Aquí está el código:

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

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

#pragma argsused

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
volver 1;
}

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

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

for(int línea = 0; línea < iFila; línea++)
for(int columna = 0; columna < iCol; columna++)
outArr(línea, columna) = inArr[línea*iCol + columna];


volver 1;
}

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

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

volver 1;
}

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

int Convert_Real_2D_Array_To_Double(ap::real_2d_array inArr, double outArr[], int iRow, intCol)
{
for(int línea = 0; línea < iFila; línea++)
for(int columna = 0; columna < iCol; columna++)
outArr[línea*iCol + columna] = inArr(línea, columna);

volver 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 Memoria adicional = 2;
// asignar memoria para las matrices
int minmn = ap::minint(Fila, 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);

//convertir los parámetros de entrada de double a ap::real_2d_array
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// Descomposición svd de la matriz
rmatrixsvd(A, Row, Col, Uneeded, VTneed, AdditionalMemory, W, U, VT);

// convertir el resultado de W, U, VT en 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);

volver 1;
}

 
2) extern "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), entonces se producen errores:

[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

Estimado, si subes el archivo con las fuentes, trataré de compilarlo y enlazarlo.

Y también - promete mostrarme el indicador mq4 en sí mismo :-).

Razón de la queja: