Ajuda a resolver um problema de importação de uma função a partir de uma dll - página 4

 
Bom conselho sobre o arquivo Eche. Vou tentar usá-lo. É claro que você está certo, eles devem ser verificados. Só queria ouvir sua opinião sobre se vale ou não a pena prestar atenção a eles, ou seja, verificá-los. Mas, a julgar pela descrição, acho que foi sobre isso que falamos, o que você acha? Ainda não sou muito bom em C++ prático, entendo com meu cérebro que não há nada globalmente complicado na escrita desses conversores, mas no momento ainda é um pouco complicado para mim e, portanto, quero resolvê-lo da maneira mais simples possível, especialmente se houver uma função pronta...
 

Confiança, mas verificar :-). Isso mesmo.

 

Estou tentando descobrir como fazer uma implementação no C++ Builder. Pelo que entendi, para fazer um arquivo EXE, é necessário fazer uma chamada consecutiva para três funções na função WinMain:

ConvertData_1 (...);

rmatrixsvd(...);

ConvertData_2 (...);

Certo? O que devemos fazer ao formar uma DLL? Da mesma forma? Eu tenho algumas dúvidas... Estou tentando usar um livro de Arkhangelsky "Programming in C++ Builder...".

Mas até agora, em vão...

 

Não faz diferença se você trabalha no Exe ou no Dll.

.

Copiei meu post da página 2 deste tópico:

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

Você deve declarar uma função como esta
externo "C" bool __declspec(dllexport) __stdcall RMatrixSVD_DLL_ADAPTER(double * in1, double * in2, double * out)
// aqui, você naturalmente passará o número de filas e colunas
{
//converter parâmetros de entrada para ap::real_2d_array
ap::real_2d_array a1 = convertPDoubleToReal2DArray(in1);
ap::real_2d_array a2 = ;
.
//calcule
ap::real_2d_array a3;
rmatrixsvd(a1, a2, a3);
.
//traduzir o resultado de a3 para fora
convertReal2DArrayToPDouble(a3, out);
.
retornar;
}

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

.

O que a função WinMain tem a ver com isso? É uma espécie de ponto de entrada para o programa...

Peço desculpas, é claro, mas você entende qual é a função?

.

Seja honesto, de 2 a 6 de setembro, quanto tempo você já gastou com essa tarefa?

Não seria melhor pedir uma consulta de 2 horas a um especialista (preparação do código + explicação)?

 

Obrigado, agora entendi... Todas estas funções são emolduradas por uma externa, que é o que estarei exportando. Desculpe, fiquei um pouco confuso...

Sobre o especialista, eu adoraria... se houvesse um em algum lugar. Mas, infelizmente, não há nenhuma, uma pena, é claro...

Este é o Cazaquistão... Embora provavelmente existam bons especialistas em Almaty e Astana, mas não consigo chegar até eles :-), a mais de 1000 km de distância.

É por isso que eu tenho que descobrir sozinho. Sim, eu já perdi muito tempo :-). Bem, não importa ... Moscou não foi construída em um dia também. :-) Como se costuma dizer.

 

Não entendo bem o Visual Studio 2010... Está disponível apenas a versão Beta agora? Tanto quanto eu entendo, ainda não há liberação?

O Visual Assist vem separadamente?

E quanto ao penúltimo lançamento do Visual Studio 2008?

 

A rigor, a partir de 2005, você terá o suficiente. Ou 2003.

O Visual Assist é uma utilidade de terceiros.

 

Para a tarefa em questão, é claro, estes são suficientes. Mas eu quero mantê-lo em perspectiva. Acho que esta tarefa não será a última...

Mas o Visual Studio 2009 parece não ocorrer, por isso perguntei sobre as últimas versões disponíveis...

Para estudar... ... então estude até o topo... :-)

 

Finalmente nasceu algo... :-)

Mas há alguns problemas durante a compilação, se você especificar que a função é exportável...

Se você especificar:

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

2) externo "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), depois há erros:

[Erro: Não resolvido 'ap::afree(void *)' externo referenciado de \COMP-BSN/MY DOCUMENTS\SVD_DLL2009.09.07\PROJETODEBUG_BUILD\U_SVD_DLL.OBJ
[Erro: Não resolvido 'ap::minint(int, int)' externo referenciado de {COMP-BSN!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJETODEBUG_BUILD\U_SVD_DLL.OBJ
[Erro: Não resolvido 'ap::amalloc(unsigned int, unsigned int)' externo referenciado de {COMP-BSN/MY DOCUMENTS!ALGORITMS\SVD\SVD_DLL\2009.09.07\PROJETODEBUG_BUILD\U_SVD_DLL.OBJ
[Erro: Não resolvido '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>&)' referenciado de {COMP-BSN}MEUS DOCUMENTOS!ALGORITMOS\\SVD\SVD_DLL\2009.09.07PROJECTO\\\VD_DBUG_BUILD\U_SVD_DLL.OBJ

Como isso pode ser interpretado?

Talvez haja algum erro no meu código?

Aqui está o código:

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

#Incluir <janelas.h>
/incluir "H_svd_dll.h".
//---------------------------------------------------------------------------

#pragma argsused

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

//---------------------------------------------------------------------------
#incluir "stdafx.h"
#incluir "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 coluna = 0; coluna < iCol; coluna++)
outArr(linha, coluna) = inArr[linha*iCol + coluna];


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

retornar 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 coluna = 0; coluna < iCol; coluna++)
outArr[linha*iCol + coluna] = inArr(linha, coluna);

retornar 1;
}

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

externo "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 VTneed = 2;
int AdditionalMemory = 2;
// alocar memória para arrays
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);

//converter parâmetros de entrada do dobro para ap::real_2d_array
Convert_Double_To_Real_2D_Array(inA, A, Row, Col);

// svd-decomposição da matriz
rmatrixsvd(A, Row, Row, Col, Uneed, VTneed, AdditionalMemory, W, U, VT);

// converter o resultado de W, U, VT em 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);

retornar 1;
}

 
2) externo "C" int __declspec(dllexport) __stdcall SVD_DLL(double inA[], double outW[], double outU[], double outVT[], int Row, int Col), então ocorrem erros:

[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 você carregar arquivos com fontes, eu tentarei compilá-los e ligá-los.

E também - promessa de me mostrar o próprio indicador mq4 :-).